我是否应该优先选择数组而不是向量?

时间:2012-07-26 08:23:06

标签: c++ arrays performance stl vector

  

可能重复:
  std::vector is so much slower than plain arrays?

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

因此,当性能成为严重问题时,我应该考虑使用数组来替换向量(如果可能)吗?

3 个答案:

答案 0 :(得分:19)

没有。 (为了满足评论学者,不,你不应该“偏好”数组而不是向量来表示性能,但是当然,你应该“考虑”使用数组替换向量,对于下面列出的特定情况)

当性能成为严重问题时,您应该根据实际数据进行优化,而不是二手故事,传闻和迷信。

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

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

  • 大小在编译时已知,
  • 尺寸小到足以放在堆叠上而不会造成问题。
  • 大小必须是固定的,而不是动态的。

在大多数情况下,这些条件都不会成立,然后无论如何都要对数组进行堆分配,然后你就失去了数组所具有的优势。

但是如果所有这些条件都是真的你可以看到这个堆分配实际上会伤害你的性能,然后是,切换到一个数组(或一个{ {1}})是有道理的。

否则?否...

答案 1 :(得分:5)

如果事先知道元素的数量,那么在编码时,是的,你应该更喜欢使用数组。 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!

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

答案 2 :(得分:0)

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