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

Deq*_*ing 5 c++ arrays performance stl vector

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

看起来像vector在堆而不是堆栈上分配.

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

jal*_*alf 19

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

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

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

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

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

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

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

除此以外?没有...

  • `std :: array`怎么样? (2认同)
  • 关于"大小在编译时已知"的部分并不完全正确,一些编译器支持运行时大小的数组的堆栈分配.(事实上​​,C99需要支持,但并非所有人都支持它,因此C11使其成为可选项). (2认同)
  • @Giel问题是关于C++的.C++/C++ 11标准不支持VLA. (2认同)

Naw*_*waz 5

如果元素的数量是预先知道的,那么在编码时,是的,你应该更喜欢使用数组.C++ 11提供了这个:

std::array<int,10000> arr;
Run Code Online (Sandbox Code Playgroud)

但是避免使用这个:

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

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

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

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