优化器是否会将临时非POD类型移出循环?

时间:2013-07-07 08:37:17

标签: c++ optimization compiler-construction

给出以下代码:

while(is_running)
{
     std::vector<buffer> buffers;

     // fill buffers

     // use buffers
}

现代编译器是否执行以下转换?

std::vector<bufer> buffers;

while(is_running)
{
     // fill buffers

     // use buffers

     buffers.clear();
}

2 个答案:

答案 0 :(得分:4)

唯一可以确定的方法是测试,但是我会非常惊讶地看到优化器执行此优化。

为了开始进行这种优化,编译器必须1)足够了解所涉及的函数的内部结构,以及实现&#34; (例如)operator newoperator delete基本上是其他任何一个的镜像,或者2)它必须为所有内联函数生成 all 代码(所有向下到operator newoperator delete的调用,并且有足够的智慧可以从代码中推断出相同的结论。

我几乎无法想象第一次,但不记得曾经见过它。鉴于典型的堆管理器的复杂性,第二个让我感到非常难以置信。

结论:我以前一直感到惊讶,我相信我会再次出现 - 但是比大多数人更令人惊讶。

答案 1 :(得分:0)

我会惊讶地发现编译器实际上知道std容器并在没有我的显式请求的情况下调用它们的方法。如果是这种情况,想象一下每当发布新的库模块时,编译器的逻辑如何需要增强!

但是,有趣的是,发现某些C ++编译器确实对标准库有一定的了解。

编辑:好的,我找到了这样一个知识的例子:基于C ++ 11范围的for循环将std :: begin和std :: end应用于范围。

无论如何,我们的程序员必须真正了解我们编写的代码并找出优化方法。编译器应该简单地翻译我们的指令,仅应用小的(但很重要的)优化(如内联,复制省略等)。