最佳答案
我试图理解当具有全局变量和静态变量的模块动态链接到应用程序时会发生什么。 所谓模块,我指的是解决方案中的每个项目(我经常使用 Visual Studio!).这些模块要么内置在 * 中。Lib 还是 * 。Dll or the * .自我解放。
据我所知,应用程序的二进制文件包含数据段中所有单个翻译单元(对象文件)的全局和静态数据(如果是 const,则只读数据段)。
当这个应用程序使用具有加载时动态链接的模块 A 时会发生什么?我假设 DLL 有一个全局和静态部分。操作系统是否加载它们?如果是这样,他们会被装到哪里?
当应用程序使用具有运行时动态链接的模块 B 时会发生什么?
如果我的应用程序中有两个模块都使用 A 和 B,那么 A 和 B 的全局变量的副本是否如下所述创建(如果它们是不同的进程) ?
DLL A 和 B 是否可以访问应用程序全局?
(请说明理由)
引自 MSDN:
在 DLL 源代码文件中声明为全局变量的变量被编译器和链接器视为全局变量,但是加载给定 DLL 的每个进程都会获得该 DLL 全局变量的自己的副本。静态变量的作用域仅限于声明静态变量的块。因此,默认情况下,每个进程都有自己的 DLL 全局和静态变量实例。
以及 给你台:
在动态链接模块时,可能不清楚不同的库是否有自己的全局变量实例,或者全局变量是否共享。
谢谢。