我非常喜欢 vector 。它们既漂亮又快速。但我知道存在这个叫做 valarray 的东西。为什么我要使用 valarray 而不是 vector ?我知道 valarrays 有一些语法糖,但除此之外,它们什么时候有用?
最佳答案
valarray
是一种在错误的时间出生在错误的地方的孤儿。这是一种优化尝试,特别是针对在编写时用于繁重数学的机器——特别是像 Crays 这样的 vector 处理器。
对于 vector 处理器,您通常想要做的是将单个操作应用于整个数组,然后将下一个操作应用于整个数组,依此类推,直到您完成了您需要做的所有事情。
但是,除非您处理的是相当小的数组,否则缓存往往效果不佳。在大多数现代机器上,您通常更喜欢(在可能的范围内)加载阵列的一部分,在其上执行您将要执行的所有操作,然后移动到阵列的下一部分。
valarray
还应该消除任何别名的可能性,这(至少在理论上)可以让编译器提高速度,因为它可以更自由地将值存储在寄存器中。然而,实际上,我完全不确定任何真正的实现是否在很大程度上利用了这一点。我怀疑这是一个先有鸡还是先有蛋的问题——没有编译器支持,它就不会流行起来,只要它不流行,没有人会费心在他们的编译器上工作来支持它。
还有一个令人眼花缭乱的(字面意思)辅助类数组与 valarray 一起使用。您可以使用 slice
、slice_array
、gslice
和 gslice_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/