c++ - .dll 文件是为每个程序加载一次还是为所有程序加载一次?

标签 c++ memory dll module loading

我有一个简单的小问题,知道的人可以轻松回答,我搜索了谷歌但找不到答案。

计算机上同时运行着许多程序,我的问题是:当程序加载 DLL 时,它是实际加载 DLL 文件还是找到已经加载 DLL 的内存?例如,ws2_32.dll (winsock 2) 是为每个使用 winsock 的程序加载,还是只加载一次,所有使用它的程序都使用相同的内存地址来调用函数?

最佳答案

它被加载一次,所有程序共享相同的内存中代码拷贝。这有点复杂,但是对于 DLL 的只读部分(即代码),操作系统加载程序使用一种称为“内存映射”的技术将 DLL 映射到进程的地址空间。对于所有进程,页面只加载到物理内存一次,即使它们可能将页面映射到其虚拟地址空间中的不同地址。

但是,每个进程都有一个单独的数据部分(因此全局变量不共享 - 除非您明确要求它们共享),而且它们显然也有一个单独的堆,因此动态分配的内存不共享。

关于c++ - .dll 文件是为每个程序加载一次还是为所有程序加载一次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2846310/

相关文章:

android - 关于纯用 c++ 编写 android 应用程序(不是混合 java/c++ 应用程序)的良好初学者 Material

c++ - 静态成员类与普通的类 C 接口(interface)

delphi - 在 Delphi 中重命名 DLL

c++ - 如何让 QSpinBox 在满时插入?

c++ - 从函数调用函数时出现 "identifier not found"错误

c - stack smashing后报错信息怎么办

c - 结构和整数的内存顺序

windows - Hyper-V WMI 类的哪些属性可访问内存信息

audio - 在哪里可以找到 nw.js 0.12.0 的 ffmpegsumo 库? (在Nodewebkit中播放音频文件)

c# - Nuget 不为弱命名程序集生成绑定(bind)重定向