所有编译时优化都可以通过链接时优化来完成吗?

时间:2015-02-24 14:48:46

标签: c optimization lto

或者是否有一些优化只能在编译时完成(因此只能在编译单元中工作)?我问,因为在C中,编译单元是一个源文件,我试图理解在某些情况下是否有任何理由不将源代码分成单独的文件(例如,如果所有源都可以进行优化在一个文件中没有完成。)

2 个答案:

答案 0 :(得分: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个代理会花费一个永恒的时间进行所有优化。

答案 1 :(得分:0)

学术范例:

main()
{
  int i;
  for (i = 0; i < MAX; i++) {
    fun(i);
  }
}

fun(int i)
{
  if (i == 0) {
    doSomething();
  }
}

如果fun位于同一个编译单元中,并且启用了data-flow-analys,则可以将foor-loop优化为单个函数调用。

但是我会留下MooseBoys的评论。