静态链接和动态链接学习笔记
1、静态链接优缺点
优点:程序模块可以独立开发和测试,提高程序的开发效率。
缺点:费内存、需要更多的磁盘空间存储、模块更新和发布困难。
多个程序使用相同的静态库,会导致内存中有多份相同的静态库文件指令副本。如下图,存在两份Lib.o文件。
还有缺点是,静态库有一些改动,就会导致使用该静态库的所有程序需要进行重新编译和发布,带来更多的工作量。
2 、动态链接
解决上述问题的方法,将程序的各独立模块分离开来,等到程序运行时,需要用到该模块,再进行链接。
动态链接的思想:将程序的链接过程,延迟到程序的运行时。即、需要时再联系,做到自身的轻量,同时,程序间增加了相互协作的依赖条件。
特点:程序运行时可以动态地选择加载各种程序模块。—— 如插件(Plug-in)
如下图的所示,无论程序多少,内存中只有一份Lib.o的副本。
优点:省内存、减少内存物理页面的换入换出、增加CPU缓存的命中率;
升级方便,如果库文件的API没有变化,只需要用新的库文件覆盖旧的库文件即可。(这种情况一般发生在程序需求开发已相对稳定阶段)。——这也说明,不是很明显的优点。
提升开发的独立性,降低开发的耦合性:不同的模块可以使用不同的编程语言,独立进行测试。—— 这点静态库也有这样的优势。其实,这些这些是单一功能或者职责设计的优势。
提升程序的兼容性:可以在各操作系统运行时,动态的链接对应操作系统提供的动态库文件。这点只要程序定义好需要的API,各操作系统根据自身的特点提供程序API所需的功能即可。
缺点:现实中,一般是应用开发人员,利用各平台提供的库文件实现自身程序功能。这可以解释为上层依赖底层实现。如果,顶层库文件的API有所变化或更新,就会导致程序没法运行,经常需要程序进行对应的修改。
综上对比:静态库、动态库都有自身的优势和劣势,实际开发中,应根据自身情况进行抉择。
疑问???
在公司的开发中,大部分人认为程序采用静态链接要比动态链接的效率高,可从上述CPU的命中率和减少内存物理页面的换入换出等优势来看,动态链接也可以提升效率,这种情况如何判断?有种方式是在实践中对采用这两种方式进行对比测试,可这带来更多的工作量和复杂性,是否有一些判断准则?望读者可以为我解惑,不胜感激。