将C ++代码拆分成多个转换单元会导致可执行文件大小的开销吗?

时间:2010-03-03 11:05:52

标签: c++ linker

我在静态库中的多个项目之间共享了一些代码。即使使用函数级链接,我也会在输出中获得比我想要的更多的对象代码 - see another question about that

当然,减少链接到最终可执行文件的目标代码量的最直接的解决方案是拆分翻译单元,以便每次使用更少的目标代码获得更多.obj文件。我甚至可以走极端 - 将每个功能放入一个单独的翻译单元。

让我假装我不关心由于十倍以上.cpp文件引起的混乱,我不关心可能的链接时间增长。

这样拆分成许多目标文件会导致可执行文件大小的开销吗?可执行文件是否会变得更大只是因为有十倍的.obj文件(但总体上它们具有完全相同的函数和变量)链接到它?

3 个答案:

答案 0 :(得分:2)

我认为,对于现代编译器而言,输出大小的胜利将会过于微妙。据我所知,编译器只使用代码中引用的那些函数。其他函数和符号将从输出文件中跳过。

答案 1 :(得分:2)

更有可能影响最终EXE大小的事情(不详尽列表):

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

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

答案 2 :(得分:1)

没有。我认为你需要的是将静态库重新编译为共享库,或者使用类似strip -g -s -R .comment之类的东西来删除未使用的代码。