2016-11-17 74 views
0

我正在考虑之间的标题只与头&源设计。我不确定头文件&源代码是否允许编译器跨目标文件和跨链接进行优化?如内联优化?C编译器能够跨目标文件进行优化吗?

+1

编译器只看到一个单独的翻译单元。所以不,它不是。但链接器可以。阅读关于LTO。不管它是什么:不要做过早的优化!编写可维护的代码,不要将定义放入头文件中(除了'inline'函数,它只应该是短函数)。 – Olaf

回答

3

通常将头文件和源文件编译为单个翻译单元(因为头文件包含在源文件中)。所以,这不会是一个问题(除非你有一个独特的环境,其中 头被分别编译)。

GCC支持跨不同翻译单元进行优化。请参阅Link Time Optimization

-flto选项的使用说明:

-flto [= N]

这个选项运行标准的链接时优化。当用 源代码调用时,它将生成GIMPLE(GCC的内部 表示之一),并将其写入对象 文件中的特殊ELF部分。当目标文件链接在一起时,所有功能 正文从这些ELF部分读取并实例化,就好像它们的 已经是同一翻译单元的一部分。要使用链接时间优化器 ,应在编译时和最终链接期间指定-flto和优化选项。建议您 使用相同的 选项编译参与同一链接的所有文件,并在链接时指定这些选项。

+0

不要忘记用'-flto'和一些*优化标志*编译*和链接*。通常,'make CC ='gcc -flto -O2'' –

+0

那么为什么'-flto'不是默认的?有没有理由不这样做? – w00d

+0

@ w00d正如为什么大多数优化默认情况下不启用:1)它可能很昂贵,2)调试可能更困难,3)偶尔会导致错误(优化器中的错误)等等。而不是用户可能需要它(或一个/多个先前陈述的可接受的理由)。 – usr