【发布时间】:2013-09-08 03:27:11
【问题描述】:
假设在 DLL 中存在这样的函数:
const Object *Get( void )
{
static Object instance;
return &instance;
}
这个静态对象在内存中的什么位置?如果从多个其他 DLL 调用此函数,是否会存在多个此静态对象的副本?
【问题讨论】:
假设在 DLL 中存在这样的函数:
const Object *Get( void )
{
static Object instance;
return &instance;
}
这个静态对象在内存中的什么位置?如果从多个其他 DLL 调用此函数,是否会存在多个此静态对象的副本?
【问题讨论】:
除非您采取明确的行动,否则我怀疑它最终会出现在您的可执行文件的.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++ 扩展。