给出以下代码:
while(is_running)
{
std::vector<buffer> buffers;
// fill buffers
// use buffers
}
现代编译器是否执行以下转换?
std::vector<bufer> buffers;
while(is_running)
{
// fill buffers
// use buffers
buffers.clear();
}
答案 0 :(得分:4)
唯一可以确定的方法是测试,但是我会非常惊讶地看到优化器执行此优化。
为了开始进行这种优化,编译器必须1)足够了解所涉及的函数的内部结构,以及实现&#34; (例如)operator new
和operator delete
基本上是其他任何一个的镜像,或者2)它必须为所有内联函数生成 all 代码(所有向下到operator new
和operator delete
的调用,并且有足够的智慧可以从代码中推断出相同的结论。
我几乎无法想象第一次,但不记得曾经见过它。鉴于典型的堆管理器的复杂性,第二个让我感到非常难以置信。
结论:我以前一直感到惊讶,我相信我会再次出现 - 但是比大多数人更令人惊讶。
答案 1 :(得分:0)
我会惊讶地发现编译器实际上知道std容器并在没有我的显式请求的情况下调用它们的方法。如果是这种情况,想象一下每当发布新的库模块时,编译器的逻辑如何需要增强!
但是,有趣的是,发现某些C ++编译器确实对标准库有一定的了解。编辑:好的,我找到了这样一个知识的例子:基于C ++ 11范围的for循环将std :: begin和std :: end应用于范围。
无论如何,我们的程序员必须真正了解我们编写的代码并找出优化方法。编译器应该简单地翻译我们的指令,仅应用小的(但很重要的)优化(如内联,复制省略等)。