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

问题描述 投票:0回答:2

给出以下代码:

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

     // fill buffers

     // use buffers
}

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

std::vector<bufer> buffers;

while(is_running)
{
     // fill buffers

     // use buffers

     buffers.clear();
}
c++ optimization
2个回答
4
投票

唯一确定的方法是进行测试,但是看到优化器执行此优化,我会感到相当惊讶。

要开始执行此优化,编译器必须 1)足够了解所涉及函数的内部结构,以“认识到”(例如)

operator new
operator delete
基本上是其他函数的镜像,或 2)它必须为所有内联函数生成 all 代码(一直到
operator new
的调用)和
operator delete
,并且有足够的智能能够从代码中推断出相同的结论。

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

底线:我以前曾感到惊讶,而且我确信我会再次感到惊讶 - 但会比大多数人都感到更大的惊喜。


0
投票

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

不过,如果发现某些 C++ 编译器确实具备一些标准库知识,那将会很有趣。

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

不管怎样,我们程序员必须真正理解我们编写的代码是做什么的,并找出优化它的方法。编译器应该简单地翻译我们的指令,仅应用小的(但重要的)优化(如内联、复制省略等)

© www.soinside.com 2019 - 2024. All rights reserved.