2010-03-03 17 views
4

我有一些代码在静态库中的多个项目之间共享。即使使用函数级链接,我也会得到比我想在输出中更多的目标代码 - see another question about that将C++代码拆分为多个转换单元是否会导致可执行文件大小的开销?

肯定是最简单的解决方案,以减少的链接到最终的可执行目标代码量会如此,我得到更多的.obj文件每个用更少的目标代码分割的翻译单元。我甚至可以走到极端 - 将每个功能放到一个单独的翻译单元中。

让我们假装我不在乎具有十倍以上.cpp文件引起的混乱,我不在乎可能存在的联系时间的增长。

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

+0

你的功能有多大?在极端情况下,由于调用者保存了寄存器等,所以对函数的调用大于内联函数。 – 2010-03-03 11:08:28

+0

我希望你已经尝试过“strip”命令和编译优化选项。看例如,http://wiki.wxwidgets.org/Reducing_Executable_Size – 2010-03-03 11:12:06

+0

哪个编译器和哪个os? – zebrabox 2010-03-03 11:37:27

回答

2

东西更有可能影响到您的最终EXE大小(而非全面的列表):

  • 无论你的静态或动态链接库(动态链接是小,因为该库中的代码是不是你的EXE内)
  • 它可能使用许多模板类,例如。矢量<甲>,矢量<乙>,矢量<Ç>将导致代码膨胀,由于具有不同类型的矢量的每一个实例化单独编译
  • 编译器设置,例如。优化,大小与速度,内联(大量内联可以使代码更大),整个程序优化(如果支持)
  • 链接器设置,例如。如果支持,则删除冗余或相同的数据。可以帮助减小尺寸。

简而言之,将更多的翻译单元分解代码可能不会产生任何影响 - 只需重新组织相同的代码即可。如果你的编译器没有考虑到整个程序的优化,它甚至可能会让事情变得更糟,因为每个翻译单元都有关于你的程序的更少的信息。

2

我认为,对现代编译器的输出尺寸胜会太微妙。据我所知,编译器只使用你的代码中引用的那些函数。其他功能和符号从输出文件中跳过。

+0

查看与此问题相关的另一个问题 - 没有正确拆分源代码可能会导致数百个未使用的全局变量链接到可执行文件。 – sharptooth 2010-03-03 11:16:49

1

不,我认为你需要的是要么重新编译静态库共享库,或使用类似:strip -g -s -R .comment删除未使用的代码。

相关问题