我为这个简单的例子计时:
#include<iostream>
#include<vector>
int main() {
int limit = 100 * 1000 * 1000;
std::vector<long> my_vec;
my_vec.reserve(limit); // comment out this line to not preallocate
for (int i=0; i < limit; i++) {
my_vec.push_back(i);
}
long my_sum = 0;
for (int i=0; i < limit; i++) {
my_sum += my_vec[i];
}
std::cout << my_sum << std::endl;
return 0;
}
符合:
g++ -std=c++11 -O2 my_file.cpp -o my_exec
并发现差异很大:
没有预分配:
real 0m3.366s
user 0m1.656s
sys 0m1.660s
使用预分配:
real 0m1.688s
user 0m0.732s
sys 0m0.936s
我的结论是:如果构建向量是程序的重要组成部分,那么为提高效率而进行预分配是有意义的。然而,一遍又一遍地构建一个更大的向量是不可能的,因此它很少是一个瓶颈。但是,使用reserve()
除了预分配之外还有其他优点。
C++ 编程语言(第 4 次添加)中的 Bjarne Stroustrup 有这样的说法:
reserve()
当我读入向量时,我曾经很小心使用。我惊讶地发现,对于我的所有用途,调用reserve()
并没有显着影响性能。默认的增长策略和我的估计一样有效,所以我停止尝试使用reserve()
. 相反,我使用它来增加重新分配延迟的可预测性并防止指针和迭代器失效。