单源代码与多个文件+库

时间:2011-06-07 04:07:37

标签: c gcc compilation libraries multiple-files

拥有多个文件或编译库与将所有内容(> 10,000 LOC)投入到一个源中的最终二进制文件有多大影响?例如,我不是单独链接Boost库,而是将其代码与原始源一起粘贴到一个巨大的文件中进行编译。在同一行中,不是将几个文件送入gcc,而是将它们全部粘贴在一起,只提供一个文件。

我对优化差异很感兴趣,而不是维护一个庞大比例的单个源文件所带来的问题(恐怖)。

当然,只能进行链接时优化(我可能错了),但优化可能性之间存在很大差异吗?

2 个答案:

答案 0 :(得分:3)

如果编译器可以看到所有源代码,如果编译器启用了某种Interprocedural Optimization (IPO)选项,它可以更好地进行优化。 IPO与其他编译器优化不同,因为它分析整个程序;其他优化仅查看单个函数,甚至是单个代码块

以下是可以完成的一些过程间优化see here for more

  • 内联
  • 常量传播
  • mod / ref analysis
  • 别名分析
  • 转发替代
  • 常规键属性传播
  • 部分死亡呼叫消除
  • 符号表数据提升
  • 死亡功能消除
  • 整个程序分析

GCC supports this kind of optimization.

此过程间优化可用于分析和优化被调用的函数。

如果编译器无法看到库函数的源代码,则无法进行此类优化。

答案 1 :(得分:2)

请注意,一些现代编译器(clang / LLVM,icc和最近甚至gcc)现在支持链接时优化(LTO),以最大限度地减少单独编译的影响。因此,您可以获得单独编译(维护,更快编译等)以及整个程序分析的好处。

顺便说一下,从版本4.1开始,gcc似乎支持-fwhole-program和--combine。但是,您必须将所有源文件一起传递。

最后,由于BOOST 主要是头文件(模板)是#included,因此您无法从源代码中添加这些文件。