boost::array
的性能与 std::vector
相比如何,并且哪些因素对其有重要影响?
boost::array
(或C++0x的std::array
)应该比std::vector
更快,因为boost::array
实例完全位于堆栈上。这意味着boost::array
没有堆分配,也意味着它不能超过在构造函数中指定的大小。
boost::array
的目的是作为围绕原始数组的薄层,以便您可以将它们视为具有.begin()
,.end()
等标准容器。好的编译器应该消除boost::array
的所有开销,使其表现与原始数组相同。
所有这些都涉及“默认”设置,其中您没有自定义分配程序,并且您测量诸如数组构造,访问和修改元素之类的简单事物。另一方面,在其他测试,其他平台或精明的设置下事情可能会发生变化。例如,
std::vector
可能不再那么昂贵。std::vector
与另一个通常是非常快的操作;交换两个指针的速度。交换两个boost::array
实例可能会更加昂贵;大约为复制n
个元素。但是,在C++0x中,其中std::array
将是一部分,再次交换两个数组将很快,这要归功于右值引用及其移动语义。boost::array
可能需要复制每个数组元素。不过,有时复制任何对象都非常快,甚至比复制指针还要快,甚至在您的C++03编译器中--这要归功于复制省略。您可以进行分析以查看哪个适合您的用途,但即使进行此测试,它也只会为特定版本的特定编译器在特定平台上提供一个想法。
std::vector
都不能进行写时复制(COW),因为这违反了迭代器失效规则。 - T.C.通过编写大量数据的程序来测试性能是得出任何结论的最佳方法。否则,你怎么能得出任何结论呢?
在此过程中,您可能需要一些工具来帮助您,例如VTune或AMD CodeAnalyst Performance Analyzer等。 Very Sleepy(免费工具)是用于Windows系统的C/C++ CPU分析器。 您可以尝试使用它们!
更快的是什么?std::vector
更快打字因为它少了一个字符。
速度快不重要,你在比较两个不同的东西,静态大小的数组和动态大小的数组。使用哪个取决于你的应用程序,与速度无关。
你想开飞机还是开车去某个地方?这取决于更多的因素,而不仅仅是“速度”。
boost::array
可能更快分配内存,因为它通常在堆栈上。或者std::vector
可能会有一些自定义的内存分配方案,所以也很快。
但这只涉及到分配内存。使用呢?这两个都只是数组的索引,所以没有区别。但是移动或交换呢?boost::array
肯定不能像std::vector
那样快速进行移动或交换,因为std::vector
只需要移动/交换指针。或者也许不是,谁知道呢?
你必须对其进行剖析并查看汇编代码。没有人可以神奇地知道事物在你的应用程序中的执行效率。
std::vector
所需的时间很容易被遍历已分配数据所需的时间所淹没。特别是如果您开始对数据进行多次遍历。 - SirGuyarray
和 vector
的用途略有不同。如果你初始化一个大小恰当的 vector
,并且它不会被重新分配内存,则两者之间的性能相同。 array
仅处理静态大小数组(如果您愿意,可以说是C风格数组)。vector
可以在向容器中添加更多对象时增长,以容纳超出其容量的对象。
std::array
(又名boost::array
)模板类,其重定向性能“损失”与向量相同(两者都非常微小,无关紧要)。 - Zac Howland
std::vector::reserve
。 - Benoitboost::array
可以静态或动态分配内存(即在栈或堆上)。而std::vector
的存储总是动态分配的,即使向量是静态分配的。 - KeithB