DLL 的开销
Posted
技术标签:
【中文标题】DLL 的开销【英文标题】:Overhead of DLL 【发布时间】:2010-10-27 04:49:01 【问题描述】:我有一个非常基本的问题。
-
当库仅由单个进程使用时。我应该将其保留为静态库吗?
如果我将库用作 DLL,但只有一个进程使用它。 **开销是多少?*
【问题讨论】:
【参考方案1】:几乎拥有一个单独的 DLL 没有任何开销。基本上,对从 DLL 导出的函数的第一次调用将运行一个微小的存根,该存根修复函数地址,以便通过跳转表的单次跳转来执行后续调用。 CPU 的工作方式,这种额外的间接寻址实际上是免费的。
主要的“开销”实际上是机会成本,而不是“开销”本身。也就是说,现代编译器可以执行称为“整个程序优化”的操作,其中整个模块(.exe 或 .dll)在链接时立即编译和优化。这意味着编译器可以在整个程序中的所有 .cpp 文件中执行诸如调整调用约定、内联函数等操作,而不仅仅是在单个 .cpp 文件中。
对于某些类型的应用程序,这可以带来相当不错的性能提升。但当然,整个程序优化不可能跨越 DLL 边界。
【讨论】:
不完全正确,在通常情况下,函数地址是在程序加载时固定的,而不是在运行时固定的。关于整个程序优化的评论已经死了,但我还没有看到任何关于它真正有用的信息。 @Mark:是的,我可能正在考虑延迟加载的 DLL...无论如何,实际开销本身在任何一种情况下都很小...【参考方案2】:DLL 有两个开销。首先,当 DLL 加载到内存中时,内部地址必须固定为加载 DLL 的实际地址,而不是链接器假定的地址。这可以通过重新设置 DLL 来最小化。第二个开销是加载程序和 DLL 时,因为对 DLL 的程序调用会填充函数的地址。除了非常大的程序和 DLL 之外,这些开销通常可以忽略不计。
如果这是一个真正的问题,您可以使用延迟加载的 DLL,它只会在调用时加载。如果从不使用 DLL,例如它实现了一个非常不常见的功能,那么它根本不会被加载。缺点是第一次调用 DLL 时会有短暂的延迟。
我喜欢使用静态链接库,不是为了减少开销,而是为了尽量减少将 DLL 与程序一起保存的麻烦。
【讨论】:
【参考方案3】:导入函数的开销并不比虚函数多。
【讨论】:
以上是关于DLL 的开销的主要内容,如果未能解决你的问题,请参考以下文章
2021-02-26:一个数组arr是二叉树的中序遍历结果,每条边的开销是父节点和子节点的乘积,总开销是所有边的开销之和。请问最