Optimization 为什么静态库只是一包对象文件,没有任何通常相互依赖的优化或重新排序?
当链接一个共享库(或者至少是一个Windows DLL)时,可以进行大量优化,所有函数和类都被放在一起并重新组织以获得最佳性能(或者我认为/希望如此) 为什么静态库只是一包对象?链接器(时间和性能方面)是否最好拥有包含在对象文件中的变量、函数、类等的列表,以便在链接使用此库的可执行或共享对象时,可以从静态库中已执行的相互依赖的优化传递中获益 静态库的创建不会花费太多时间(无论如何,只有有限数量的优化是可能的),但是使用该库的后续构建步骤会更快/更优化Optimization 为什么静态库只是一包对象文件,没有任何通常相互依赖的优化或重新排序?,optimization,linker,static-libraries,object-files,Optimization,Linker,Static Libraries,Object Files,当链接一个共享库(或者至少是一个Windows DLL)时,可以进行大量优化,所有函数和类都被放在一起并重新组织以获得最佳性能(或者我认为/希望如此) 为什么静态库只是一包对象?链接器(时间和性能方面)是否最好拥有包含在对象文件中的变量、函数、类等的列表,以便在链接使用此库的可执行或共享对象时,可以从静态库中已执行的相互依赖的优化传递中获益 静态库的创建不会花费太多时间(无论如何,只有有限数量的优化是可能的),但是使用该库的后续构建步骤会更快/更优化 PS:我在这里主要谈论的是链接时间优化,但由
PS:我在这里主要谈论的是链接时间优化,但由于所有流行的工具链都以拥有此功能为荣,我相信这个问题会以某种方式出现吗?请不要回答这个问题:它一直都是这样,或者说没有人想过要改变它。这不是我想要的…这些文件中有原型。它们可能与您提到的列表类似这些文件中有原型。它们可能与您提到的列表类似链接时间代码生成和链接前优化之间存在冲突 假设从该库中,您仅使用固定参数调用函数Foo一次:
Foo(12)
。LTCG现在允许将Foo()实现简化为单一情况,从而使您以前可能收集到的所有优化和调用树信息无效
记住这一点,只有Foo()
不调用Bar()
的信息才能保留下来。不过,我不认为这会显著降低链接阶段的压力
排序信息同样受到探查器引导的优化的影响:哪些函数是需要分组在一起的热点,只能由最终的二进制文件确定
一般来说,优化似乎正在向链接阶段移动,而不是以前的阶段——虽然您建议的优化是可行的,但如果您将其与可使用的场景数量和代码中的额外复杂性(大致与bug数量成比例)进行权衡,则可能不会有回报链路时间代码生成和链路前优化之间存在冲突 假设从该库中,您仅使用固定参数调用函数Foo一次:
Foo(12)
。LTCG现在允许将Foo()实现简化为单一情况,从而使您以前可能收集到的所有优化和调用树信息无效
记住这一点,只有Foo()
不调用Bar()
的信息才能保留下来。不过,我不认为这会显著降低链接阶段的压力
排序信息同样受到探查器引导的优化的影响:哪些函数是需要分组在一起的热点,只能由最终的二进制文件确定
一般来说,优化似乎正在向链接阶段移动,而不是以前的阶段——虽然您建议的优化是可行的,但如果您将其与可使用的场景数量和代码中的额外复杂性(大致与bug数量成比例)进行权衡,则可能不会有回报嗯。。。一直都是这样。也许您可以换一种说法:“是否有一种对象格式/扩展允许编译器明确地存储元数据(例如库中对象的相互依赖性),这可能会使链接时间优化更快、更智能?”(提示:如果你意识到你的问题要求的是毫无帮助的答案,请解决这个问题!)sehe:好吧,元数据并不是我真正想要的,它更像是一个包含所有内容的单一对象文件,而不是一个只包含一包其他文件的文件,其中包含代码:)好吧。。。一直都是这样。也许您可以换一种说法:“是否有一种对象格式/扩展允许编译器明确地存储元数据(例如库中对象的相互依赖性),这可能会使链接时间优化更快、更智能?”(提示:如果你意识到你的问题要求的是毫无帮助的答案,请解决这个问题!)sehe:好吧,元数据并不是我真正想要的,它更像是一个包含所有内容的单一对象文件,而不是一个只包含一包其他文件的文件,其中包含一些代码:)