c - 哪个在运行时使用更多 RAM,动态链接还是静态链接?

标签 c dynamic linker static-linking

我知道动态链接在磁盘上占用的空间较小,但它们在运行时使用的内存更多吗?如果是,为什么?

最佳答案

答案是“这取决于你如何衡量它”,也“这取决于你在哪个平台上运行”。

静态链接使用较少的运行时 RAM,因为动态链接需要将整个共享对象加载到内存中(我将在一秒钟内限定此语句),而静态链接仅加载您实际需要的那些函数。

上述说法并非 100% 准确。仅加载实际包含您使用的代码的共享对象页面。这仍然比将这些函数压缩在一起的静态链接效率低得多。

另一方面,动态链接使用的运行时 RAM 少得多,因为使用相同共享对象的所有程序都在 RAM 中使用相同的代码副本(稍后我将对此声明进行限定)。

以上是类 Unix 系统上的真实陈述。在 Windows 上,它不是 100% 准确。在 Windows 上(至少在 32 位 Intel 上,我不确定其他平台),DLL 不是用与位置无关的代码编译的。因此,每个 DLL 都带有它需要加载的(虚拟内存)加载地址。如果一个可执行文件链接两个重叠的 DLL,加载程序将重新定位其中一个 DLL。这需要修补 DLL 的实际代码,这意味着此 DLL 现在带有特定于此程序使用它的代码,并且无法共享。然而,这种碰撞应该很少见,而且通常是可以避免的。

举例说明,静态链接 glibc 可能会导致您在运行时消耗更多 RAM,因为这个库很可能在您的程序启动之前就已经加载到 RAM 中。静态链接一些只有您的程序使用的独特库将节省运行时 RAM。中间情况是介于两者之间。

关于c - 哪个在运行时使用更多 RAM,动态链接还是静态链接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46551696/

相关文章:

c - %255[^\0]s 和 %255c 之间的区别

c# - C# 中不允许接口(interface)<动态> - 解决方法

arrays - 为什么我会看到这种奇怪的行为?

java - 在同一进程中加载​​多个共享库

c++ - 无法链接到 OSX High Sierra 中的 libclang

c++ - 如何将我想在 C++ 中使用的 C 库的库路径添加到环境中

c - 从字符串 C 挑战中获取 Remove ME

不能接受多个命令行参数并分配给变量

c++ - 如何创建动态数组

c++ - 链接后的最小可执行文件大小