0

我很好奇编译器会做多少优化,所以......

// assume we have this declared somewhere
std::vector<int> vec;

// my question is, when fully optimized will this...
for (int i(0); i<100; ++i)
    vec.push_back(i);

// evaluate to this? psuedo code...
const size_t size = size();
const size_t newsize = size + 100;
if (size < vec.capacity())
    vec.exponentialGrowth();
vec.setSize(newsize);
for (size_t i(size); i<newsize; ++i)
    vector[i] = i;

我正在使用启用了优化的 Visual Studio Express 2012。我试过查看反汇编,但优化使其难以阅读。

4

2 回答 2

2

查看带有/Ox指定选项的 VS 2012 生成的程序集,编译器并未优化以一次性为所有 100 个元素保留容量。

它一个一个地添加元素,当需要额外的空间时,将向量的容量增加 50%。向量的容量从 0 开始,然后像这样增长:

1, 2, 3, 4, 6, 9, 13, 19, 28, 42, 63, 94, 141 

GCC 4.7.2 的-O2行为类似,但容量增加了一倍,而不是增长了 50%。

于 2012-12-03T08:40:37.310 回答
0

std::vector无论编译器优化是否打开,都会以指数方式调整大小。

如果您担心调整大小的性能(并且无法reserve提前提供足够的空间),请考虑使用std::deque. 引用Herb Sutter的话:“与向量相比,双端队列更易于使用,并且天生对增长更有效率。”

于 2012-12-03T02:17:55.913 回答