C++ 标准矢量和升压阵列:哪个更快?
C++ 标准矢量和升压阵列:哪个更快?,c++,arrays,boost,stl,vector,C++,Arrays,Boost,Stl,Vector,boost::array的性能与std::vector相比如何,哪些因素对其有显著影响?得出任何结论的最佳方法是编写程序,用大量数据测试其性能。否则怎么能得出结论呢 当您使用它时,您可能需要一些工具来帮助您,例如,或等(免费工具)是用于Windows系统的C/C++CPU分析器。你可以试试 数组和向量的用途稍有不同。如果将向量初始化为所需大小,并且永远不会重新分配,则两者之间的性能是相同的数组仅处理静态大小的数组(如果愿意,可以使用C样式数组)向量会增长。boost::array(或C++0x的
boost::array
的性能与std::vector
相比如何,哪些因素对其有显著影响?得出任何结论的最佳方法是编写程序,用大量数据测试其性能。否则怎么能得出结论呢
当您使用它时,您可能需要一些工具来帮助您,例如,或等(免费工具)是用于Windows系统的C/C++CPU分析器。你可以试试
数组
和向量
的用途稍有不同。如果将向量
初始化为所需大小,并且永远不会重新分配,则两者之间的性能是相同的<代码>数组仅处理静态大小的数组(如果愿意,可以使用C样式数组)<如果您将更多的对象推入容器中,而容器中的对象数量超出了容器当前的容量,则代码>向量会增长。boost::array
(或C++0x的std::array
)应该比std::vector
更快,因为boost::array
实例完全在堆栈上。这意味着boost::array
没有堆分配,也意味着它不能超过您在构建时为它指定的大小
boost::array
的目的是充当基本数组周围的一层薄薄的容器,因此您可以使用.begin()
、.end()
等将它们视为标准容器。好的编译器应该消除boost::array
的所有开销,以使其执行与基本数组相同
所有这些都与“默认”设置有关,您没有自定义分配器,您可以测量简单的事情,如数组构造、元素访问和修改。另一方面,在其他测试、其他平台或巧妙的设置中,情况可能会有所好转。比如说,
- 如果您创建一个自定义分配器,可能在程序启动时获取一个大的内存池,那么构建或调整
的大小可能不再那么昂贵std::vector
- 将一个
与另一个交换通常是一个非常快速的操作;交换两个指针的速度。交换两个std::vector
实例可能要昂贵得多;按复制boost::array
元素的顺序。但是,在C++0x中,n
将是其中的一部分,由于右值引用及其移动语义,交换两个数组将再次快速进行std::array
- 复制向量可能是一个非常快速的操作;与复制指针一样快(写入时复制)。复制
可能需要复制每个数组元素。再说一次,有时候复制任何对象都非常快,甚至比复制指针还要快,甚至比在C++03编译器中还要快——多亏了复制省略boost::array
您可以通过配置文件来查看哪个更快,但即使是此测试也只能让您了解特定平台上特定编译器的特定版本。在什么情况下更快
std::vector
打字更快,因为它少了一个字符
无论什么更快,您都在比较两种不同的东西,静态大小的数组和动态大小的数组。使用哪一种取决于您的应用程序,而与速度无关
你想驾驶飞机还是汽车去某个地方?这取决于更多,而不仅仅是“更快”
一个
boost::array
可能分配得更快,因为它在典型的机器上位于堆栈上。或者std::vector
可能会因为一些自定义内存分配方案而几乎一样快
但这只是分配。使用呢?这两个都是数组的索引,所以可能没有什么不同。但是移动或交换呢boost::array
当然不能这么快完成,因为std::vector
只需要移动/交换一个指针。也许不是,谁知道呢
您必须分析并查看部件。没有人能神奇地知道事情对您的影响。我怀疑这可能是您的应用程序的瓶颈。@Benoit。我在做科学计算,速度对它来说非常重要。@Roman:那么你应该知道如何配置文件。@Roman,一个是编译时间有限的,另一个可以根据需要灵活增长-你需要什么?@Benoit A
boost::array
可以静态或动态分配(即在堆栈或堆中)。std::vector
的存储始终是动态分配的,即使向量是静态分配的。在我看来,对于较大的数组大小,您无法使用boost::array。否则可能会导致堆栈溢出。正确吗?如果您在堆栈@Ypnos上分配它,那么是的,您可以预期堆栈溢出(或者编译器错误,如果编译器不允许类型超过某个大小)。如果动态分配,则不应出现堆栈溢出,除非错误地按值传递数组。(但是编译器错误仍然是一个风险,无论您在哪里分配值。)在什么情况下更快?最初的问题充其量只是含糊其辞。他指的是数组/向量成员的访问,还是指填充/分配数组/向量成员的工作?@JontrantVein我陈述了我的假设。在我看来,用陈述的假设给出一个答案,回答“这取决于”并就此停下来会更有帮助。嘿,非常困倦是一个不错的小工具!(我更正了链接。)因为向量需要通过指针访问底层数据,所以数组可能有一点性能优势,因为向量访问必须经过一个更高级别的间接寻址。除了极端情况,我怀疑这是现代硬件上值得考虑的因素。他说的不是C风格的数组,他指的是std::array
(又称boost::array
)模板类,它具有与向量相同的重定向性能“命中”(两者都非常微小)