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

我有一个简单的小问题,有人知道会很容易回答,我搜索谷歌,但找不到答案。
一台计算机上同时运行着许多程序,我的问题是:当一个程序加载一个dll时,它实际上是加载了dll文件还是找到了加载该dll的内存?例如,是为每个使用winsock的程序加载ws2_32.dll(winsock 2),还是只加载一次,所有使用它的程序都使用相同的内存地址来调用函数?


最佳答案:

它只加载一次,所有程序共享相同的内存代码副本。这有点复杂,但是对于DLL的只读部分(即代码),操作系统加载程序使用一种称为“内存映射”的技术将DLL映射到进程的地址空间。对于所有进程,页面只加载一次到物理内存中,即使它们可能在其虚拟地址空间中将页面映射到不同的地址。
但是,每个进程都有一个单独的数据段(这样全局变量就不会被共享——除非您明确要求共享),而且它们显然也有一个单独的堆,这样动态分配的内存就不会被共享。

    公众号
    关注公众号订阅更多技术干货!