为什么 std::vector 比本机数组的性能更高

Why can std::vector be more performant than a native array?

本文关键字:性能 数组 本机 std vector 为什么      更新时间:2023-10-16

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

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

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

  1. 矢量管理它自己的内存,数组你必须记住来管理内存
  2. Vector 允许您更轻松地使用 stdlib(使用动态数组,您必须自己跟踪结束 PTR),这一切都是编写得很好的经过良好测试的代码
  3. 有时向量甚至可以更快,比如qsort v std::sort,阅读这篇文章,请记住,发生这种情况的原因是编写更高级别的代码通常可以让您更好地推理手头的问题。
  4. 由于 std 容器可以很好地用于其他所有内容,动态数组不会涵盖这些容器,因此保持代码样式的一致性使其更具可读性并且不易出错。

我要记住的一件事是,您不应该将动态数组与std::vector进行比较,因为它们是两回事。它应该与类似 std::dynarray 的东西进行比较,不幸的是,它可能不会进入 c++14(boost prolly 有一个,我敢肯定周围有参考实现)。std::dynarray实现不太可能与本机阵列有任何性能差异。

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

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

不过,这也可以用普通数组来实现。