您的位置:首页 > 其它

静态链接和动态链接的区别

2016-01-02 11:21 274 查看
静态链接把要调用的库函数直接链接到目标程序。成为可执行文件的一部分。换句话说,要调用的库函数在程序的exe文件中,该文件包含了运行时所需的全部代码。静态链接的缺点是当多个程序都调用相同的函数时,内存中会有多个这个函数的拷贝,所以浪费了内存资源。

l 动态链接所调用的库函数代码并没有拷贝到程序的可执行文件中。它仅仅在exe文件中加入了调用的函数所在文件模块(DLL)和调用函数在文件中的位置等信息链接进目标程序,仅当应用程序被装入内存开始运行时,才从DLL中寻找相应函数代码,因此需要相应DLL文件的支持

静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib中的指令都被直接包含在最终生成的EXE文件中了。但是若使用动态链接库,则DLL不必被包含在最终的EXE文件中,EXE文件执行时可以“动态”地引用和卸载这个与EXE独立的DLL文件

 

采用动态链接库的优点:(1)更加节省内存;(2)DLL文件与EXE文件独立,只要输出接口不变,更换DLL文件不会对EXE文件造成任何影响,因而极大地提高了可维护性和可扩展性

为什么动态链接相对于静态链接来说便于软件版本的修改和更新?

静态链接是指把要调用的函数或者过程链接到可执行文件中,成为可执行文件的一部分,已经整合进去了,无法修改,每次进行软件的更新升级就要重新编译exe。dll的只是把目标函数的路径放进去了,动态链接所调用的函数代码并没有被拷贝到应用程序的可执行文件中,在程序运行过程中,需要调用时通过这个路径(对所调用函数的描述定位信息),直接在主程序或system32目录下找到后调用。

静态库和动态库的区别

装入时动态链接

在装入过程中将所有动态链接库载入内存。应用程序在运行时,将所有可能要运行到的模块都全部装入内存。显然这比运行时动态链接低效很多,因为往往会有些目标模块根本就不运行。比较典型的例子是作为错误处理用的目标模块,如果程序在整个运行过程中都不出现错误,则显然就不会用到该模块。相对静态链接,节省了内存空间(因为可以共享动态库),但是并没有加快程序的载入。

运行时动态链接

在许多情况下,应用程序在运行时,每次要运行的模块可能是不相同的。但由于事先无法知道本次要运行哪些模块,故只能是将所有可能要运行到的模块都全部装入内存,并在装入时全部链接在一起。显然这是低效的,因为往往会有些目标模块根本就不运行。比较典型的例子是作为错误处理用的目标模块,如果程序在整个运行过程中都不出现错误,则显然就不会用到该模块。 近几年流行起来的运行时动态链接方式,是对上述在装入时链接方式的一种改进。这种链接方式是将对某些模块的链接推迟到程序执行时才进行链接,亦即,在执行过程中,当发现一个被调用模块尚未装入内存时,立即由OS去找到该模块并将之装入内存,把它链接到调用者模块上。凡在执行过程中未被用到的目标模块,都不会被调入内存和被链接到装入模块上,这样不仅可加快程序的装入过程,而且可节省大量的内存空间。相比静态链接,加快了程序的载入(因为只载入了动态库的符号,但运行时可能多次从磁盘调用动态库,从而拉低整体运行速度),比装入时动态链接更节省内存,(在内存中的运行的只有一部分动态库,每次用到磁盘中的动态库时再调用)

如果一个动态链接库被多个程序访问,那每个程序怎么引用这个动态链接库?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: