*** 作系统中程序的链接:装入时动态链接、运行时动态链接和静态链接都是什么意思?有什么区别?

 *** 作系统中程序的链接:装入时动态链接、运行时动态链接和静态链接都是什么意思?有什么区别?,第1张

静态链接是在生成可执行程序的时候就把库中的内容加入到程序中。\r\n\r\n载入时动态链接是在将功能模块读入内存时把动态库中调用到的相关模块的内容载入内存。\r\n运行时动态链接是在执行程序调用到模块内容时再将动态库中的相应模块载入到内存。\r\n\r\n这里有两个时间问题。一是载入时间,缺竖二是执行时间。\r\n静态链接由于是在一开始就把所有模块都加载进入内存,所以如果模块很多的话效率就会被大大拉低。\r\n载入时动态链接是分别载入,当把一个模块载入内存时检查有调用关系的模块载入,比静态链接节省了许多开销。\r\n运行时动态链接则是把当前模块调用的模块推迟到调用的时候再载岁扮帆入。\r\n三者之间的关系就像是机q,冲锋q乎雹和手q\r\n机q在一开始就把所有子d装好,开q的时候很快,但也很笨重。\r\n冲锋q则是将子d分d夹存好,轻便了许多,但是会有一段装填时间。\r\n手q就更加轻便了,但是d夹容量更小,装填的频率又变高了。

参考一下:

源文件的编译过程包含两个主要阶段,而它们之间的转换是自动的。第一个阶段是预处理阶段,在正式的编译阶段之前进行。预处理阶段将根据已放置在文件中的预处理指令来修改源文件的内容。#include指令就是一个预处理指令,它把头文件的内容添加到.cpp文件中还有其他许多预处理指令

这个在编译之前修改源文件的方式提供了很大的灵活性,以适应不同的计算机和 *** 作系统环境的限制。圆氏一个环境需要的代码跟另一个环境所需的代码可能有所不同,因为可用的硬件或 *** 作系统是不同的。在许多情况下,可以把用于不同环境的代码放在同一个文件中,再在预处理阶段修改代码,使之适应当前的环境。

预处理器显示为一个独立的 *** 作,但一般不能独立于编译器来执行这个 *** 作。调用编译器会自动执行预处理过程,之后才编译代码。

编译器为给定源文件输出的是机器码,执行这个过程需要较长时间。在对象文件之间并没有建立任何连接。对应于某个源文件的对象文件包含在其他源文件中定义的函数引用或其他指定项的引用,而这些函数或项仍没有被解析。同样,也没郑数有建立同库函数的链接。实际上,这些函数的代码并不是文件的一部分。这些工作是由链接程序(有时称为链接编辑器)完成的

链接程序把所有对象文件中的机器码组合在一起,并解析它们之间的交叉引用。它还集成了对象模块所使用的库函数的代码。这是链接程序的一种简化表示,因为这里假定在可执行模块中,模块之间的所有链接都是静态建立的。实际上有些链接是动态的,即这些链接是在程序执行时建立的。

链接程序静态地建立函数之间的链接,即在程序执行之前建立组成程序的源文件中所包含的函数链接。动喊腔首态建立的函数之间的链接(在程序执行过程中建立的链接)将函数编译并链接起来,创建另一种可执行模块—— 动态链接库或共享库。动态链接库中的函数链接是在程序调用函数时才建立的,在程序调用之前,该链接是不存在的。

动态链接库有几个重要的优点。一个主要的优点是动态链接库中的函数可以在几个并行执行的程序之间共享,这将节省相同函数占用的内存空间。另一个优点是动态链接库在调用其中的函数之前是不会加载到内存中的。也就是说,如果不使用给定动态链接库中的函数,该动态链接库就不会占用内存空间


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12564437.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存