将 C++ 代码拆分为多个翻译单元是否会增加可执行文件大小的开销?

sha*_*oth 5 c++ linker

我在静态库中的多个项目之间共享了一些代码。即使使用函数级链接,我也会在输出中获得比我想要的更多的目标代码 -请参阅有关该的另一个问题

当然,减少链接到最终可执行文件的目标代码数量的最直接的解决方案是拆分翻译单元,以便我获得更多的 .obj 文件,每个文件都有更少的目标代码。我什至可以走极端——把每个函数放到一个单独的翻译单元中。

让我们假设我不在乎十倍多的 .cpp 文件造成的混乱,我不在乎可能的链接时间增长。

这种拆分成许多目标文件是否会增加可执行文件大小的开销?可执行文件是否会因为链接到其中的 .obj 文件(但总体而言它们具有完全相同的函数和变量)多 10 倍而变得更大?

Ash*_*ain 3

更有可能影响最终 EXE 大小的因素(并非详尽列表):

  • 无论您是静态还是动态链接到库(动态链接较小,因为库代码不在 EXE 内部)
  • 可以使用许多模板类,例如。矢量<A>、矢量<B>、矢量<C>会导致代码膨胀,因为不同类型的矢量的每个实例都是单独编译的
  • 编译器设置,例如。优化、大小与速度、内联(大量内联可以使代码更大)、整个程序优化(如果支持)
  • 链接器设置,例如。如果支持,删除冗余或相同的数据。可以帮助减小尺寸。

简而言之,将代码拆分为更多翻译单元可能不会产生任何效果 - 相同的代码,只是重新组织。如果您的编译器不考虑整个程序优化,事情甚至可能会变得更糟,因为每个翻译单元中关于您的程序的信息较少。