在动态链接库(C/C++)中静态变量的行为

8

此处所述,静态变量存储在.BSS或.DATA段中。

如果静态变量位于动态链接库中的函数内,该内存存储在哪里?这个变量的存储是否在链接过程的.BSS或.DATA段中分配?

2个回答

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

所以,如果我理解你的意思正确的话,如果多个进程链接到这个共享库,那么变量将会在不同进程之间的调用中表现为“静态”? - nagul
3
不,每个连接到它的进程都会加载一个新的DLL实例,因此数据段不会在进程之间共享。 - Rob K
明白了。DLL 有自己的内存段,静态变量就放在那里面。 - nagul

1

是的。不同类型的静态变量之间的区别在于:

  • 作用域

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接