标准矢量和增强阵列:哪个更快?

时间:2011-02-14 16:56:27

标签: c++ arrays boost stl vector

boost::array的效果与std::vector的表现相比较,以及哪些因素会对其产生重大影响?

4 个答案:

答案 0 :(得分:31)

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实例可能要贵得多;按照复制std::array元素的顺序。但是,在C ++ 0x中,boost::array将成为其中的一部分,由于rvalue引用及其移动语义,交换两个数组将再次快速。
  • 复制矢量可能是一个非常快速的操作;和复制指针一样快(写入时复制)。复制{{1}}可能需要复制每个数组元素。然后,有时复制任何对象非常快,甚至比复制指针更快,甚至在C ++ 03编译器中 - 感谢copy elision。

您可以查看哪个更快,以供您使用,但即使是此测试也只会让您了解特定平台上特定版本的特定编译器。

答案 1 :(得分:17)

得出任何结论的最佳方法是编写程序以使用大量数据测试其性能。如何得出任何结论?

在您使用它时,您可能需要一些工具来帮助您,例如VTuneAMD CodeAnalyst Performance Analyzer等。Very Sleepy(免费工具)是C / C ++适用于Windows系统的CPU分析器。你可以尝试一下!

答案 2 :(得分:12)

什么时候更快? std::vector输入速度更快,因为它的字符少一个。

无论什么更快,你要比较两个不同的东西,一个静态大小的数组和一个动态大小的数组。使用哪个取决于您的应用程序,与速度无关。

您想在某个地方操作飞机或汽车吗?这取决于更多只是“更快”。


分配boost::array的速度可能更快,因为它在典型的机器上是堆栈上的。或者std::vector可能几乎与某些自定义内存分配方案一样快。

但这只是分配。怎么用?那么两者都只是一个数组的索引,所以也许没有区别。但是移动或交换呢? boost::array当然不能那么快,因为std::vector只需要移动/交换指针。或许不是,谁知道?

您必须剖析并查看装配体。没有人能够神奇地知道事情的表现如何。

答案 3 :(得分:2)

arrayvector的目的略有不同。如果将vector初始化为您需要的大小并且永远不会重新分配,则两者之间的性能是相同的。 array只处理静态大小的数组(如果你愿意,可以处理C风格的数组)。如果您将更多对象推入容器中,则vector可以增长,而不是当前容量。