1

链接共享库(或至少是 Windows DLL)时,可以进行很多优化,并且所有函数和类都被放在一起并重新组织以获得最佳性能(或者我认为/希望如此)。

为什么静态库只是一袋对象?链接器(在时间和性能方面)拥有包含在目标文件中的变量、函数、类等列表不是更好吗,因此在链接使用此库的可执行文件或共享对象时可以从静态库中相互依赖的事物上已经执行的优化传递中获利?

静态库的创建不会花费太多时间(无论如何,只有有限数量的优化是可能的),但是使用这个库的后续构建步骤会更快/最优。

PS:我在这里主要谈论链接时间优化,但是由于所有流行的工具链都以拥有此功能而自豪,我敢肯定这个问题会以某种方式弹出?请不要用以下方式回答这个问题:它一直都是这样,或者兼容性没有人想过要改变它。那不是我要找的...

4

2 回答 2

1

链接时间代码生成和链接前优化之间存在冲突。

假设您从该库中仅使用固定参数调用函数 Foo 一次:Foo(12)。LTCG 现在允许将 Foo() 实现简化为单一情况,使您之前可能收集的所有优化和调用树信息无效。

考虑到这一点,只有不调用的Foo()信息才能结转Bar()。不过,我看不出这将如何显着降低链接阶段的压力。

排序信息同样受到分析器引导的优化:哪些函数是需要组合在一起的热点只能由最终的二进制文件确定。


一般来说,优化似乎正朝着链接阶段移动,远离之前的阶段——虽然你建议的优化是可行的,但当你将它与可以使用的场景数量以及额外的代码复杂度(大致与错误数量成正比)

于 2011-12-06T16:41:31.560 回答
0

这些文件中有原型。他们可能就像你提到的清单一样

于 2011-12-06T07:42:50.020 回答