我有一个简单的小问题,知道的人可以轻松回答,我搜索了谷歌但找不到答案。
计算机上同时运行着许多程序,我的问题是:当程序加载 DLL 时,它是实际加载 DLL 文件还是找到已经加载 DLL 的内存?例如,ws2_32.dll (winsock 2) 是为每个使用 winsock 的程序加载,还是只加载一次,所有使用它的程序都使用相同的内存地址来调用函数?
最佳答案
它被加载一次,所有程序共享相同的内存中代码拷贝。这有点复杂,但是对于 DLL 的只读部分(即代码),操作系统加载程序使用一种称为“内存映射”的技术将 DLL 映射到进程的地址空间。对于所有进程,页面只加载到物理内存一次,即使它们可能将页面映射到其虚拟地址空间中的不同地址。
但是,每个进程都有一个单独的数据部分(因此全局变量不共享 - 除非您明确要求它们共享),而且它们显然也有一个单独的堆,因此动态分配的内存不共享。
关于c++ - .dll 文件是为每个程序加载一次还是为所有程序加载一次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2846310/