动态链接vs静态链接效率

Dynamic link vs. static link efficiency

本文关键字:链接 效率 静态 vs 动态      更新时间:2023-10-16

我和另一个开发人员有一个争论,我想在这里解决动态链接和静态链接的问题。

在理论:

假设你有一个包含100个函数的库,每个函数里面都有大量的代码:

int A()
int B()
int C()
..
..and so on...

并且您的应用程序只调用或依赖于其中一个。

你有两种方法可以使用。

  1. 将库构建为动态链接库
  2. 将库构建为静态链接库
我的同事声称,将静态库链接到我们的应用程序时,编译器/链接器不会将99个未使用函数的代码添加到我们的可执行文件中。我认为会的。我认为在这种情况下,唯一的优点是拥有单个可执行文件,而不必将库与应用程序一起分发,但是如果我们使用动态链接库方法,则不会有显着的大小差异。

谁是正确的?

这取决于代码的组织方式和使用的编译器标志。

经典后,简单的模型,链接器将在任何对象文件链接在图书馆需要满足符号引用,所以如果你的()、B()和C()都定义在不同的对象文件,只有对象文件,其中包含你实际使用的符号会链接到程序(除非它反过来依赖一个或多个其他的,在这种情况下,链接器会找到目标文件来满足这些引用,递归,直到它要么满足所有要求,要么找到一个不能满足的要求(这时您会得到标准的"Unresolved external XXX"错误消息)。

最近,大多数编译器可以将函数"打包"到单独的"模块"中,而不必将它们放入单独的源文件中以创建单独的目标文件。细节各不相同,但可以减少(或消除)使每个源文件尽可能小的必要性,以便将最终可执行文件中的内容保持在最小。

所以,至少在大多数情况下,他是对的,而你是错的。

看情况:-)

如果您将每个函数放在自己的源文件中,或者使用/Gy编译选项,则每个函数将被打包在静态库的单独部分中。

链接器将能够根据需要挑选它们,并且只包含实际调用的函数。