3

这是关于静态本地人的两个问题,一直困扰着我,我还没有找到明确的答案:

问题一:

 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() 的时间?它是否在运行时维护一个标志,这是否是这个函数的第一次调用?

4

1 回答 1

2

这实际上是两个不相关的问题。

首先,有多种解决方案。也许最常见的是一种叫做弱符号的东西。粗略地说,编译器会在每个使用该函数的目标文件中以特定名称生成一个实例,链接器会丢弃重复项,并仅在最终程序中保留一个。

对于第二种,通常的解决方案是生成一个与对象关联的布尔变量,并在对象进入范围时对其进行测试。

于 2012-04-10T08:41:24.553 回答