或者是否有一些只能在编译时完成的优化(因此只能在编译单元内工作)?我问是因为在 C 中,编译单元是一个源文件,我试图了解在某些情况下是否有任何理由不将源代码拆分为单独的文件(例如,如果所有源代码都可以进行优化在一个文件中没有完成)。
问问题
145 次
2 回答
1
典型的(简化的)编译可能看起来像
1) Pre-process
2) Parse code to internal representation
3) Optimize code
4) Emit assembly language
5) Assemble to .o file
6) Link .o file to a.out
LTO 通常是通过在第 2 步和第 3 步之间将内部编译器表示转储到磁盘,然后在最后的链接(第 6 步)期间返回并执行第 3-5 步来实现的。然而,这可能取决于编译器和版本。如果它遵循这种模式,那么您会看到 LTO 等同于编译时优化。
然而 ...
拥有非常大的源文件可能很烦人——Emacs 开始阻塞大于 10MB 的源文件。
如果您处于多用户开发环境中,根据您的 SCM,如果多个工程师正在处理同一个文件,您可能会遇到很多麻烦。
如果您使用分布式构建系统,您将并行执行编译。因此,如果每个编译和优化一个文件需要 1 秒,并且您有 1000 个文件和 1000 个构建代理,那么您的总编译时间是 1 秒。如果您在决赛期间对所有 1000 个文件进行所有优化,那么您将有 999 个代理处于空闲状态,而 1 个代理会花费永恒的时间来完成所有优化。
于 2015-02-24T16:34:12.620 回答
0
学术例子:
main()
{
int i;
for (i = 0; i < MAX; i++) {
fun(i);
}
}
fun(int i)
{
if (i == 0) {
doSomething();
}
}
如果fun
在同一个编译单元中,并且启用了数据流分析,则可以将 for-loop 优化为单个函数调用。
但是:我会坚持 MooseBoys 的评论。
于 2015-02-24T15:36:18.290 回答