【问题标题】:implicit dynamic linking vs explicit dynamic linking - which is more effective? [closed]隐式动态链接与显式动态链接 - 哪个更有效? [关闭]
【发布时间】:2018-03-14 15:34:19
【问题描述】:

有两种方法可以链接共享库。
一种称为隐式动态链接,一种称为显式动态链接。
我用谷歌搜索了一些文档,但没有找到文档告诉两者的效率差异。
以 linux .so 文件为例。我的疑问是:隐式链接与显式方式相比,显式方式会以某种方式导致更多的 IO 或 cpu 或内存吗?
想知道哪种方式更有效,为什么?
非常感谢!

【问题讨论】:

    标签: c dynamic linker implicit


    【解决方案1】:

    据我了解,隐式动态链接是通过在程序的依赖项部分添加库来说明您的程序需要该库才能运行的事实。如果在程序开始时没有找到该库,则程序根本不会被执行。

    显式动态链接使用诸如“LoadLibrary”(Windows)或“dlopen”(Linux)之类的函数来在运行时加载库。这就是插件的本质,以及如何编写代码。

    现在,执行显式动态链接会增加工作量和复杂性,我认为没有任何理由比隐式动态链接更有效。仅当您无法执行其他操作时才使用显式动态链接,例如根据某些运行时值加载库。

    【讨论】:

    • 所以“隐式”是加载程序和操作系统确保库可用,而“显式”是程序员。当然也可以混合使用。
    • 另外:某些 Windows DLL 不会被隐式加载,例如 RICHED32.DLL。如果没有LoadLibrary 调用,程序将无法启动(或崩溃)。
    • 感谢您的回答。以 linux .so 文件为例。我的疑问是:隐式链接与显式方式相比,显式方式会以某种方式导致更多的 IO 或 cpu 或内存吗?
    • 仅从您的程序的角度来看,是的,因为您必须调用额外的函数(确实执行 I/O)并在运行时保留信息(因此会占用内存)。但是,这些相同的操作将在执行您的程序之前完成,所以在全球范围内,也许它是相同的。我可以肯定的是,担心内存消耗,额外的 IO / CPU 可能是无用的,因为这些操作应该在运行时只完成一次。如果你在while循环中疯狂地打开/关闭,是的,这会很糟糕,但这与打开/关闭图片以在GUI中显示它是一样的[...]
    • [...] 或任何其他操作,如分配内存,在之后释放并再次分配它(幸运的是,在这种情况下,内部分配机制可能会防止性能下降,因为当你释放内存时,它并没有真正将内存还给操作系统)。在这种情况下,是算法坏了,而不是加载 dll/so 的事实。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多