5

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

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

那么当性能成为一个严重问题时,我是否应该考虑使用数组来替换向量(如果可能)?

4

3 回答 3

19

不。(为了满足评论学究,不,你不应该“更喜欢”数组而不是向量来提高性能,但可以肯定的是,对于下面概述的特定情况,你应该“考虑”使用数组来替换向量)

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

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

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

  • 大小在编译时已知,并且
  • 尺寸足够小,可以放在堆栈上而不会引起问题。
  • 大小必须是固定的,而不是动态的。

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

但是,如果所有这些条件都成立,并且您可以看到这种堆分配实际上会明显损害您的性能,那么是的,切换到数组(或 a std::array)是有意义的。

否则?不...

于 2012-07-26T08:26:30.733 回答
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!

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

于 2012-07-26T08:30:33.583 回答
0

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

于 2012-07-26T08:27:13.933 回答