这两个关于静态本地人的问题一直困扰着我,我还没有找到明确答案:
问题1:
struct Test
{
static inline const char* name()
{
static const char* nameValue = "Name of Test";
return nameValue;
}
};
由于该方法是内联的,因此在每个调用它的编译单元中都应该有一个此方法的副本。但是,必须只有一个本地静态变量nameValue
的实例(如果我错了,请纠正我)。这是如何实现的?我们生成了许多函数实例,但它们都引用了相同的静态局部。编译器是否按名称维护与每个函数关联的静态本地的全局表?
问题2:
struct Init
{
Init() {printf("init created\n");}
~Init() {printf("init destroyed\n");}
};
struct Test
{
static void func()
{
static Init init;
}
};
静态本地Init对象仅在第一次调用func()时构造一次。编译器如何知道第一次调用func()的时间?它是否在运行时保持一个标志,这是否是第一次调用此函数?
答案 0 :(得分:2)
这些是两个无关的问题。
首先,有各种解决方案。也许是最常见的 被称为弱符号的东西。粗略地说,编译器 在每个目标文件中生成特定名称下的实例 使用该函数,链接器仅抛出重复项 在最终的节目中保留一个。
对于第二种,通常的解决方案是生成一个布尔变量 与对象关联,并在对象进入时对其进行测试 范围。