为什么std :: vector比本机数组更高效?

时间:2013-11-11 22:59:25

标签: c++ vector std

我们的教授声称,在Java和C ++之间的性能比较中,在std :: vector上选择原生数组(像int * a = new int[NUM]这样的动态数组)没有任何好处。她声称,优化后的矢量可以更快,但没有告诉我们原因。矢量背后的魔力是什么?

请回答性能问题,这不是一般性民意调查!

3 个答案:

答案 0 :(得分:3)

任何具有较低级别内容(例如原始数组)的超级优化代码都可以击败或绑定std::vector的性能。但是,使用向量的好处远远超过从低级代码获得的任何小的性能提升。

  1. vector管理它自己的内存,你必须记住管理内存的数组
  2. vector允许您更容易地使用stdlib(使用动态数组,您必须自己跟踪最终的ptr),这些都是经过良好编写的经过良好测试的代码
  3. 有时候矢量甚至可以更快,比如qsort v std :: sort,读取这个article,请记住这可能发生的原因是因为编写更高级别的代码通常可以让你更好地推理问题在眼前。
  4. 由于std容器很适合用于其他所有内容,因此动态数组不会覆盖,保持代码在样式上的一致性使其更易读,更不容易出错。
  5. 我要记住的一件事是你不应该将动态数组与std::vector进行比较,它们是两个不同的东西。它应该与像std::dynarray这样的东西进行比较,遗憾的是它可能不会进入c ++ 14(boost prolly有一个,我确信存在参考实现)。 std::dynarray实现不太可能与本机数组有任何性能差异。

答案 1 :(得分:1)

  1. 当需要更改元素数量时,使用向量而不是数组是有好处的。
  2. 优化的矢量都不比阵列快。

答案 2 :(得分:0)

std::vector可以在普通阵列上提供的唯一性能优化是,它可以请求比当前需要更多的内存。 std::vector::reserve就是这么做的。添加元素capacity()将不再涉及任何分配。

这也可以用普通数组实现。