Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 标准矢量和升压阵列:哪个更快?_C++_Arrays_Boost_Stl_Vector - Fatal编程技术网

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
    实例可能要昂贵得多;按复制
    n
    元素的顺序。但是,在C++0x中,
    std::array
    将是其中的一部分,由于右值引用及其移动语义,交换两个数组将再次快速进行
  • 复制向量可能是一个非常快速的操作;与复制指针一样快(写入时复制)。复制
    boost::array
    可能需要复制每个数组元素。再说一次,有时候复制任何对象都非常快,甚至比复制指针还要快,甚至比在C++03编译器中还要快——多亏了复制省略

您可以通过配置文件来查看哪个更快,但即使是此测试也只能让您了解特定平台上特定编译器的特定版本。

在什么情况下更快
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
)模板类,它具有与向量相同的重定向性能“命中”(两者都非常微小)