gpt4 book ai didi

c++ - 静态链接与动态链接

转载 作者:bug小助手 更新时间:2023-10-28 01:31:12 29 4
gpt4 key购买 nike

在某些情况下,是否有任何令人信服的性能理由来选择静态链接而不是动态链接,反之亦然?我听过或读过以下内容,但我对这个主题的了解还不够,无法保证其真实性。

1) 静态链接和动态链接在运行时性能上的差异通常可以忽略不计。

2) (1) 如果使用使用配置文件数据来优化程序热路径的分析编译器则不成立,因为通过静态链接,编译器可以同时优化您的代码和库代码。使用动态链接只能优化您的代码。如果大部分时间都花在运行库代码上,这会产生很大的不同。否则,(1) 仍然适用。

最佳答案

  • 动态链接可以减少总资源消耗(如果多个进程共享同一个库(当然包括“相同”中的版本))。我相信这是插入它在大多数环境中存在的论点。这里的“资源”包括磁盘空间、RAM 和缓存空间。当然,如果您的动态链接器不够灵活,则存在 DLL hell 的风险。 .
  • 动态链接意味着错误修复和库升级传播以改进您的产品,而无需您交付任何东西。
  • 插件总是需要动态链接。
  • 静态链接,意味着您可以知道代码将在非常有限的环境中运行(在启动过程的早期,或在救援模式下)。
  • 静态链接可以使二进制文件更容易分发到不同的用户环境(以发送一个更大、更消耗资源的程序为代价)。
  • 静态链接可能允许稍微更快的启动时间,但这在一定程度上取决于程序的大小和复杂性以及操作系统加载策略的详细信息。

在评论和其他答案中包含非常相关的建议的一些编辑。我想指出,你打破这个的方式很大程度上取决于你计划在什么环境中运行。最小的嵌入式系统可能没有足够的资源来支持动态链接。稍微大一点的小系统可能很好地支持动态链接,因为它们的内存足够小,使得动态链接节省的 RAM 非常有吸引力。成熟的消费 PC 有,如 Mark notes ,巨大的资源,您可能可以让便利问题插入您对此事的思考。


解决性能和效率问题:视情况而定

传统上,动态库需要某种粘合层,这通常意味着函数寻址中的双重调度或额外的间接层,并且可能会花费一点速度(但函数调用时间实际上是运行时间的很大一部分吗?? ?)。

但是,如果您运行的多个进程都大量调用同一个库,那么在使用动态链接时,相对于使用静态链接,您最终可以节省缓存行(从而赢得运行性能)。 (除非现代操作系统足够聪明,可以注意到静态链接二进制文件中的相同段。似乎很难,有人知道吗?)

另一个问题:加载时间。您在某个时候支付装载费用。您何时支付此费用取决于操作系统的工作方式以及您使用的链接。也许你宁愿推迟支付,直到你知道你需要它。

请注意,静态与动态链接传统上不是优化问题,因为它们都涉及单独编译到目标文件。但是,这不是必需的:编译器原则上可以将“静态库”最初“编译”为摘要的 AST 形式,然后通过将这些 AST 添加到为主代码生成的 AST 中来“链接”它们,从而实现全局优化。我使用的系统都没有这样做,所以我无法评论它的工作情况。

回答性能问题的方法是始终通过测试(并尽可能使用类似于部署环境的测试环境)。

关于c++ - 静态链接与动态链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1993390/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com