可能重复:
std::vector 比普通数组慢得多?
看起来向量是在堆而不是堆栈上分配的。
那么当性能成为一个严重问题时,我是否应该考虑使用数组来替换向量(如果可能)?
不。(为了满足评论学究,不,你不应该“更喜欢”数组而不是向量来提高性能,但可以肯定的是,对于下面概述的特定情况,你应该“考虑”使用数组来替换向量)
当性能成为一个严重问题时,您应该根据实际数据进行优化,而不是二手故事、道听途说和迷信。
如果用数组替换你的向量给你一个可衡量的(和必要的)加速,那么你应该这样做。
但请注意,您只能在以下情况下使用堆栈分配的数组:
在大多数情况下,这些条件都不成立,然后无论如何都必须在堆上分配数组,然后您就失去了数组所具有的一个优势。
但是,如果所有这些条件都成立,并且您可以看到这种堆分配实际上会明显损害您的性能,那么是的,切换到数组(或 a 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 ,因为它比普通数组更好的类型安全性。