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