在性能方面,我应该更喜欢数组而不是矢量吗



可能重复:
std::vector比普通数组慢那么多?

看起来向量是在堆上而不是堆栈上分配的。

所以,当性能成为一个严重问题时,我是否应该考虑使用数组来代替矢量(如果可能的话)?

否。(为了满足评论学究的要求,不,为了性能,你不应该"更喜欢"数组而不是矢量,但当然,对于下面列出的特定情况,你应该"考虑"使用数组来代替矢量)

当性能成为一个严重问题时,您应该根据实际数据进行优化,而不是二手故事、道听途说和迷信

如果用一个数组替换你的向量能给你一个可衡量的(必要的)加速,那么你应该这样做

但请注意,您只能在以下情况下使用堆栈分配的数组:

  • 大小在编译时已知,并且
  • 该尺寸足够小以适合堆叠而不会引起问题
  • 大小必须是固定的,而不是动态的

在大多数情况下,这些条件都不成立,然后无论如何都必须对数组进行堆分配,然后您就失去了数组的一个优势。

但是如果所有这些条件都为真,您可以看到这种堆分配实际上严重损害了您的性能,那么是的,切换到数组(或std::array)是有意义的。

否则呢?编号…

如果在编码时提前知道元素的数量,那么是的,您应该更喜欢使用数组。C++11提供了以下功能:

std::array<int,10000> arr;

但请避免使用以下内容:

int arr[10000]; //avoid it in C++11 (strictly), and possibly in C++03 also!

在C++03中,在大多数情况下,您仍然应该更喜欢std::vector(除非实验显示它很慢):

std::vector<int> arr;
arr.reserve(10000); //it is good if you know the (min) number of items!

在大多数情况下,当向量看起来很慢时,这是因为程序员没有利用reserve()函数。相反,当向量调整大小时,它们依赖于重复的分配解除分配复制策略。

除非您在一个特殊的系统上运行(即一个内存分配器较慢的系统),否则不太可能产生显著的影响。我建议您更喜欢使用std::vector,因为它比普通数组具有更好的类型安全性。

最新更新