DLL的开销

时间:2010-10-27 04:49:01

标签: c++ windows dll

我有一个非常基本的问题。

  1. 当库仅由单个进程使用时。我应该把它保存为静态库吗?
  2. 如果我将库用作DLL,但只有一个进程使用它。 **什么是开销?*

3 个答案:

答案 0 :(得分:11)

拥有单独的DLL几乎没有 开销。基本上,对从DLL导出的函数的第一次调用将运行一个小的存根来修复函数地址,以便通过跳转表单次跳转来执行后续调用。 CPU的工作方式,这种额外的间接实际上是免费的。

主要的“开销”实际上是机会成本,而不是“开销”本身。也就是说,现代编译器可以执行一种称为“整个程序优化”的操作,其中整个模块(.exe或.dll)在链接时立即编译和优化。这意味着编译器可以在整个程序中的所有.cpp文件中调整调用约定,内联函数等,而不仅仅是在单个.cpp文件中。

对于某些类型的应用程序,这可以带来相当不错的性能提升。但是,当然,整个程序优化不能跨越DLL边界发生。

答案 1 :(得分:3)

DLL有两个开销。首先,当DLL被加载到内存中时,内部地址必须固定为加载DLL的实际地址,而不是链接器假定的地址。这可以通过重新基于DLL来最小化。第二个开销是加载程序和DLL时,因为程序调用DLL会填充函数的地址。除了非常大的程序和DLL之外,这些开销通常可以忽略不计。

如果这是一个真正令人担忧的问题,您可以使用延迟加载的DLL,这些DLL只会在调用时加载。如果从不使用DLL,例如它实现了一个非常罕见的函数,那么它根本就不会被加载。缺点是第一次调用DLL时有一个短暂的延迟。

我喜欢使用静态链接库,不是为了减少开销,而是尽量减少必须将DLL保留在程序中的麻烦。

答案 2 :(得分:2)

导入的函数没有虚拟函数的开销。