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

grz*_*zkv 16 c++ arrays boost stl vector

性能如何与之boost::array相比std::vector,哪些因素对它有显着影响?

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

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

  • 什么更快?最初的问题充其量是模糊的.他是指数组/向量成员的访问,还是他指的是填充/分配相同的工作? (5认同)
  • 如果你在堆栈上分配它,@ Ypnos,那么是的,你可以预期堆栈溢出(或编译器错误,如果编译器不允许超过一定大小的类型).如果动态分配,那么除非错误地按值传递数组,否则不应该出现堆栈溢出.(但无论您在何处分配值,编译器错误仍然存​​在风险.) (2认同)

Naw*_*waz 17

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

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


GMa*_*ckG 12

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

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

你想在某个地方经营飞机或汽车吗?这取决于更多只是"更快".


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

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

你必须剖析并查看组件.没有人能够神奇地知道事情对你的影响.