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