C++ STL中的优化期望

C++ STL中的优化期望,c++,optimization,compiler-construction,stl,C++,Optimization,Compiler Construction,Stl,我很好奇编译器会做多少优化,所以 // 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 =

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

// 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;
//假设我们在某处声明了这个
std::vec;
//我的问题是,当完全优化时,这将。。。

对于(inti(0);i,
std::vector
将以指数方式调整大小,无论是否启用编译器优化


如果您担心调整大小性能(并且不能预先编写代码>预留< /代码>足够的空间),请考虑使用<代码> STD::DEQu< /COD>。

查看VS 2012在指定了
/Ox
选项的情况下生成的程序集,编译器不会优化以一次为所有100个元素保留容量

它一个接一个地添加元素,当需要额外的空间时,将向量的容量增加50%。向量的容量从0开始,然后按如下方式增长:

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

GCC 4.7.2与
-O2
的性能类似,但容量增加了一倍,而不是增加了50%。

Re:“我试过查看反汇编,但优化使其难以阅读。”这可能意味着优化器在优化方面做得很好。:-P更重要的是,我不认为您提供的代码会像这样被优化掉,除非最先进的优化器最近已经接近神奇的优化水平。可能不会。如果您知道目标大小,请使用
resize
(或
保留
)。同时,请注意,完成的平均拷贝数接近上限(如果内存可用,在大多数实现中大约为3个)因此,即使在最坏的情况下,这也很少像许多人最初认为的那样是一个大问题。与其使用int作为模板参数,不如使用用户定义的类。插入不同的构造函数,看看会发生什么。@在硅片中。我通常知道“为模糊而优化”,但假设“为模糊而优化”是愚蠢的.我不认为这是神奇的,它只是将容量检查移出了循环,对吗?@user515430,“为不同的构造函数设置仪器”,请简要解释一下这句话。我有指数增长()在代码中,因为我假设reserve将只分配要求的内容,而如果优化只是将resize check移出循环,它几乎肯定会呈指数增长。这并不能解释指数增长不够快的情况,但最终问题是关于优化预期。@Histu如果
push_-back
将使
向量成倍增长,我怀疑编译器是否足够聪明,能够理解
push_-back
调用的数量与所需的最终内存之间的关系。这是一个猜测,但一个受过教育的猜测:编译器根本不在那个抽象级别上运行。很容易检查k、 毕竟:只要在打开和不打开优化的情况下阅读
容量
,如果有差异,我就错了。