程序动态链接、静态连接的对照(优缺点)

程序动态链接、静态连接的对比(优缺点)

 为什么要动态链接?

  也可以问,动态链接相对于静态连接有啥好处?首先明确动态链接和静态连接的区别:静态连接就是在程序编译阶段,将程序需要的所有东西打包放到一起;而动态链接是在程序需要运行时,根据需要动态的决定链接哪一个库,哪一个函数。

举个例子,每个人就是一个程序,磁盘就是一间房子,库文件就是人们生活的必需品(如锅碗瓢盆),静态连接就是:每个人都带着自己的锅碗瓢盆进入一间房子,房子里只有一个炉子可用(单核CPU),每个人做饭过程相当于进程执行。人少还行,人多了房子就很挤,其实不必要每个人都带一套锅碗瓢盆,把锅碗瓢盆放到那里,谁想用就排队,顺序使用(单核CPU在同一时刻只能运行一个进程)就行。例子不很恰当,能明白就行。

1、节省内存空间、磁盘空间

因为静态连接需要将公用的函数链接到程序中,就像每个人都有一套锅碗瓢盆,这样当然浪费磁盘空间,而且运行时每个进程都要有自己的函数,浪费内存空间。

2、软件更新容易,因为只更新库就行。

更新库就相当于更新锅碗瓢盆。

3、减少物理页面的换入换出,增加CPU cache命中率

程序具有局部性原理。

4、适用于大规模的软件开发,使开发过程独立、耦合度小,便于不同开发者和开发组织之间进行开发和测试。

5、增加程序可扩展性、兼容性。

动态链接文件可以在程序运行时链接,所以所有软件的插件就是这么做的。关于更好的兼容性是因为,只要库提供的功能相同,在不同的OS之间运行同一个软件是很容易的,而静态连接换了OS就需要重新编译,使用目标OS中的库重新链接。

动态链接的缺点:

1、当某个模块更新后,如果新模块与旧的模块不兼容,那么那些需要该模块才能运行的软件,统统撕掉。这在早期Windows中很常见。

2、动态链接相比静态连接有些慢,但是很少1%-5%性能损失。