DLL 中 C 样式函数中的静态变量

Posted

技术标签:

【中文标题】DLL 中 C 样式函数中的静态变量【英文标题】:Static Variable in C-Style Function within DLL 【发布时间】:2013-09-08 03:27:11 【问题描述】:

假设在 DLL 中存在这样的函数:

const Object *Get( void )

  static Object instance;
  return &instance;

这个静态对象在内存中的什么位置?如果从多个其他 DLL 调用此函数,是否会存在多个此静态对象的副本?

【问题讨论】:

【参考方案1】:

除非您采取明确的行动,否则我怀疑它最终会出现在您的可执行文件的.bss 部分或.data 部分中。映射时,它们使用写时复制语义进行映射。

如果您希望共享它,您需要告诉编译器将它放在具有shared 属性的部分中。执行此操作的 Visual C++ 代码如下所示。

#pragma section("mysec",read,write,shared)
__declspec(allocate("mysec")) Object instance = 0;

const Object *Get( void )

  return &instance;

不知道在函数内部声明静态变量时是否可以使用__declspec

更多文档here

【讨论】:

您应该指出__declspec 是Microsoft Visual C++ 扩展。 我不确定这与我原来的问题有什么关系?我确实希望静态变量存在于内存中的一个位置,并在 dll 之间共享,但我不明白这有什么帮助? @RandyGaul 查看here 以了解写时复制的描述。如果您了解Virtual Memory,这也会有所帮助,因为我认为您要共享的是物理页面,而不是虚拟内存地址。

以上是关于DLL 中 C 样式函数中的静态变量的主要内容,如果未能解决你的问题,请参考以下文章

跨 dll 使用静态类变量/函数

c++中关于私有静态变量的问题

库 (DLL) 中的静态变量是不是由引用该库的所有进程共享?

static 函数中的静态变量

C++ 静态库中的共享全局变量

c++DLL编程详解