Linux——对动静态库的优缺点和底层剖析对比

目录

静态库底层剖析:

所以静态库的优缺点总结:

动态库底层剖析:

所以使用动态库的优缺点剖析:


静态库底层剖析:

         如上图: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++编译器就是默认首选动态链接动态库。 

猜你喜欢

转载自blog.csdn.net/weixin_69283129/article/details/131421903