C/C++编译器是否在编译单元之间进行优化?

Gab*_*ier 8 c optimization

可以在同一编译单元(即同一文件)中的函数之间进行诸如常量传播的优化.

例如 :

int f(int x)
{
    return 3 + x;
}

int main(void)
{
    printf("%d\n", 1 + f(4));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在那个例子中,我认为一个足够智能的编译器可以将'4'常量传播到函数'f',用另一个常量'3'求解整数算术,并传回结果值,从而将所有内容折叠到最终值'8'.

(好吧,如果我错了,请纠正我..)

但是,如果函数'f'在另一个编译单元中,会发生什么.由于它们都是单独编译的,因此编译器无法优化这种方式.

这是否意味着优化只能在同一个编译单元中进行,或者是否存在某些形式的链接时延迟优化?

rub*_*nvb 7

MSVC(自8.0:VS2005)和GCC(自4.5以来)都支持这一概念.

  • MSVC使用编译器开关/GL和链接器开关/LTCG.文档

  • GCC必须启用它并使用-flto,-fwhole-program,-fwhopr,和/或-combine达到同样的效果.文档(在浏览器中搜索选项)

"问题"是每个编译单元(源文件)(以及MSVC每个库的情况下)都需要使用它编译,因此您不能使用没有它编译的旧二进制目标文件.它还使调试更难,因为优化器更具攻击性和不可预测性.