静态链接库与动态链接库都是共享代码的方式。
静态链接库(lib): 在程序执行之前完成所有的组装工作,生成一个可执行的目标文件(EXE文件)。
静态库的两个特点:
- 链接后产生的可执行文件包含了所有需要调用的函数的代码,因此占用磁盘空间较大。
- 如果有多个(调用相同库函数的)进程在内存中同时运行,内存中就存有多份相同的库函数代码,因此占用内存空间较多。
动态链接库(dll&lib): 在程序装载内存的时候才真正的把库函数代码链接进行确定它们的地址,并且就算有几个程序同时运行,内存也只存在一份函数代码。动态库的代码必须满足这样一种条件:能够被加载到不同进程的不同地址。根据载入程序何时确定动态代码的逻辑地址,可以把动态装载分为两类:
- 静态绑定(static binding): 装载时动态链接,使用静态绑定的程序一开始载入内存的时候,载入程序就会把程序所有调用到的动态代码的地址算出确定下来,这种方式使程序刚运行的初始化时间较长,不过旦完成动态装载,程序的运行速度就很快。
- 动态绑定(dynamic binding):运行时动态链接,使用这种方式的程序并不在一开始就完成动态链接,而是直到真正调用动态库代码时,载入程序才计算(被调用的那部分)动态代码的逻辑地址,然后等到某个时候,程序又需要调用另外某块动态代码时,载入程序又去计算这部分代码的逻辑地址,所以,这种方式使程序初始化时间较短,但运行期间的性能比不上静态绑定的程序。
静态链接库和动态链接库区别:
- 静态链接库在程序执行之前就完成了库的装载,而动态链接库是在程序执行过程中加载。
- 当有多处需要同一函数时,动态链接库只需要一份拷贝即可,而静态链接库则需要多份拷贝。
- 静态链接库不能再包含其他的静态链接库或动态链接库,而动态链接库还可以包含其他的静态链接库或动态链接库。
- 如果改变库函数,包含静态链接库的程序需要重新链接,而包含动态链接库的程序则不需要,因而极大地提高了可维护性和可扩展性。