【问题标题】:Behaviour of static variables in dynamically linked libraries (C/C++)动态链接库 (C/C++) 中静态变量的行为
【发布时间】:2010-11-14 16:30:42
【问题描述】:

正如here 所讨论的,静态变量存储在 .BSS 或 .DATA 段中。

如果静态变量位于动态链接库中的函数内部,则此内存存储在哪里?链接时是否在链接过程的 .BSS 或 .DATA 段中分配了此变量的存储空间?

【问题讨论】:

    标签: c++ memory static shared-libraries


    【解决方案1】:

    静态变量将在 DLL 文件的 .BSS 或 .DATA 部分结束。链接到 DLL 的可执行文件可能甚至不知道它的存在。当 EXE 加载 DLL 时,系统会为其设置 DLL 的数据段,然后调用 DllMain()。这就是 DLL 静态数据出现并被初始化的时候。

    【讨论】:

    • 所以,如果我理解正确的话,如果多个进程链接到这个共享库,该变量将在不同进程的调用中表现为“静态”?
    • 不,实际上每个连接到它的进程都会加载一个新的 DLL 实例,因此数据段不会在进程之间共享。
    • 明白。 DLL 有自己的内存部分,静态变量进入其中。
    【解决方案2】:

    是的。不同种类的静态变量之间的区别是:

    • 范围

    • 动态初始化的初始化时间。

    实现(注意 BSS 和 DATA 段是实现细节)通常是相同的。为了确保动态初始化的静态函数变量的正确初始化,一种方法是添加一个额外的布尔值,指示需要动态初始化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-22
      • 1970-01-01
      • 1970-01-01
      • 2012-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多