目录
静态库底层剖析:
所以静态库的优缺点总结:
动态库底层剖析:
所以使用动态库的优缺点剖析:
静态库底层剖析:
如上图:file1.exe被加载到了内存,成为了进程,因为代码中都有printf函数的应用,且我们采用的是libC.a静态库进行链接,所以操作系统将静态库中关于printf函数的实现方法拷贝了一份,然后拿到内存的代码区中。此时file2.exe文件也被加载到了内存,且代码中也有printf函数的应用,所以同样的,操作系统将静态库中关于Printf函数的实现方法又拷贝了一份,放在内存的代码区中。
静态库的缺点就体现出来了!因为两个文件中都有printf,就不得不拷贝两份printf的底层实现到内存,若是有100个文件也都拥有printf,意味着操作系统还要再从静态库中拷贝100次,造成了内存区域中代码的冗余。
而优点在于将静态库的printf拷贝到内存后,就代码后面再出现printf就不再依赖静态库了,因为内存中已经有了printf的实现方式。
所以静态库的优缺点总结:
(1)静态库在使用时,直接把代码复制到目标文件中;
(2)优点: 不需要跳转,效率比较好,脱离静态库文件;
静态库会被打包到应用程序内,加载速度上快了很多;
发布程序时不需要依赖静态库,移植方便。
(3)缺点: 目标文件会比较大,修改和维护都不太方便;
多个文件使用该库时,会造成代码冗余!消耗系统资源;
更新、部署、发布麻烦;
(4)静态库文件名的名字规则: 以lib开头,以.a结尾
动态库底层剖析:
如上图:file1.exe被加载到了内存,成为了进程,因为代码中都有printf函数的应用,且我们采用的是libC.so动态库进行链接,操作系统对静态库中关于printf函数的地址进行复制,然后拿到内存中,放在了代码内部。此时file2.exe文件也被加载到了内存,也是一样,对于printf的应用只是复制该函数的地址到代码内部。
动态库的优点体现出来了!操作系统不需要向上面动态库那样拷贝函数的代码实现到内存中,只需要复制函数地址,等到CPU运行该函数时,从函数地址就能找到该动态库,然后在动态库中扫描Printf函数的实现方式后返回运行。
但这样下来,程序的代码对动态库的依赖性就很强,需要来回的跳转内存的代码和动态库,效率就低了些。
所以使用动态库的优缺点剖析:
(1) 共享库的特征也叫动态库,因为它可以实现进程之间的资源共享;
(2)共享库在使用时,直接把代码中所需要用到的函数所对应的地址复制过来;(3)优点: 目标文件比较小,修改和维护都方便;
更新、部署、发布简单。
(4)缺点:需要跳转,效率比较低,不能脱离共享库文件;加载速度比静态库慢,发布程序时需要依赖动态库;
注:当程序使用到动态库时,动态库才加载进去,此后其他程序可以共享同一个动态库。当动态库更改时,只需要更新下动态库,而应用程序不需要再进行编译、部署、发布。
(5)动态库文件名的名字规则: 以lib开头,以.so结尾
总体比较下来,动态库要优于静态库,所以在Linux中,gcc/g++编译器就是默认首选动态链接动态库。