这是关于静态本地人的两个问题,一直困扰着我,我还没有找到明确的答案:
问题一:
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() 的时间?它是否在运行时维护一个标志,这是否是这个函数的第一次调用?