转载 - 程序动态链接、静态连接的对比(优缺点)
原文链接:https://blog.csdn.net/qianlong4526888/article/details/8108585
为什么要动态链接?
也可以问,动态链接相对于静态连接有啥好处?首先明确动态链接和静态连接的区别:静态连接就是在程序编译阶段,将程序需要的所有东西打包放到一起;而动态链接是在程序需要运行时,根据需要动态的决定链接哪一个库,哪一个函数。
举个例子,每个人就是一个程序,磁盘就是一间房子,库文件就是人们生活的必需品(如锅碗瓢盆),静态连接就是:每个人都带着自己的锅碗瓢盆进入一间房子,房子里只有一个炉子可用(单核CPU),每个人做饭过程相当于进程执行。人少还行,人多了房子就很挤,其实不必要每个人都带一套锅碗瓢盆,把锅碗瓢盆放到那里,谁想用就排队,顺序使用(单核CPU在同一时刻只能运行一个进程)就行。例子不很恰当,能明白就行。
1、节省内存空间、磁盘空间
因为静态连接需要将公用的函数链接到程序中,就像每个人都有一套锅碗瓢盆,这样当然浪费磁盘空间,而且运行时每个进程都要有自己的函数,浪费内存空间。
2、软件更新容易,因为只更新库就行。
更新库就相当于更新锅碗瓢盆。
3、减少物理页面的换入换出,增加CPU cache命中率
程序具有局部性原理。
4、适用于大规模的软件开发,使开发过程独立、耦合度小,便于不同开发者和开发组织之间进行开发和测试。
5、增加程序可扩展性、兼容性。
动态链接文件可以在程序运行时链接,所以所有软件的插件就是这么做的。关于更好的兼容性是因为,只要库提供的功能相同,在不同的OS之间运行同一个软件是很容易的,而静态连接换了OS就需要重新编译,使用目标OS中的库重新链接。
动态链接的缺点:
1、当某个模块更新后,如果新模块与旧的模块不兼容,那么那些需要该模块才能运行的软件,统统撕掉。这在早期Windows中很常见。
2、动态链接相比静态连接有些慢,但是很少1%-5%性能损失。