C++ valarray 与 vector

标签 c++ stl stdvector c++-standard-library valarray

我非常喜欢 vector 。它们既漂亮又快速。但我知道存在这个叫做 valarray 的东西。为什么我要使用 valarray 而不是 vector ?我知道 valarrays 有一些语法糖,但除此之外,它们什么时候有用?

最佳答案

valarray 是一种在错误的时间出生在错误的地方的孤儿。这是一种优化尝试,特别是针对在编写时用于繁重数学的机器——特别是像 Crays 这样的 vector 处理器。

对于 vector 处理器,您通常想要做的是将单个操作应用于整个数组,然后将下一个操作应用于整个数组,依此类推,直到您完成了您需要做的所有事情。

但是,除非您处理的是相当小的数组,否则缓存往往效果不佳。在大多数现代机器上,您通常更喜欢(在可能的范围内)加载阵列的一部分,在其上执行您将要执行的所有操作,然后移动到阵列的下一部分。

valarray 还应该消除任何别名的可能性,这(至少在理论上)可以让编译器提高速度,因为它可以更自由地将值存储在寄存器中。然而,实际上,我完全不确定任何真正的实现是否在很大程度上利用了这一点。我怀疑这是一个先有鸡还是先有蛋的问题——没有编译器支持,它就不会流行起来,只要它不流行,没有人会费心在他们的编译器上工作来支持它。

还有一个令人眼花缭乱的(字面意思)辅助类数组与 valarray 一起使用。您可以使用 sliceslice_arraygslicegslice_array 来处理 valarray 的片段>,让它像一个多维数组一样。您还可以使用 mask_array 来“屏蔽”一个操作(例如,将 x 中的项目添加到 y,但仅限于 z 非零的位置)。为了不只是简单地使用 valarray,您必须了解很多关于这些辅助类的知识,其中一些非常复杂,而且(至少对我而言)似乎没有很好的文档记录。

底线:虽然它有辉煌的时刻,并且可以很好地完成一些事情,但也有一些很好的理由让它(并且几乎肯定会保持)晦涩难懂。

编辑(八年后,即 2017 年):前面的一些内容至少在某种程度上已经过时了。例如,英特尔为他们的编译器实现了 valarray 的优化版本。它使用英特尔集成性能基元 (英特尔 IPP) 来提高性能。尽管确切的性能改进无疑各不相同,但使用简单代码的快速测试显示,与使用 valarray 的“标准”实现编译的相同代码相比,速度提高了大约 2:1。

所以,虽然我不完全相信 C++ 程序员会开始大量使用 valarray,但至少在某些情况下它可以提高速度。

关于C++ valarray 与 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1602451/

相关文章:

c++ - 如何使用唯一对象调整 std::vector 的大小

c++ - 为什么 STL 为 std::container::begin 和 std::container::end 函数提供 const 重载?

c++ - 如何识别哪个 QObject 在 Qt 中发出信号?

c++ - 用于 PCI 设备信息的 C/C++-API

c++ - 循环后保留一个值

c++ - 我在哪里可以获得 "useful"C++ 二分搜索算法?

c++ - std::unordered_set::find - 仅为 find() 构造一个实例

c++ - 字符串和商店

c++ - 为什么我的数据元素被复制而不是 move ?

c++ - 这不应该使用回溯算法吗?