关于静态本地如何由编译器实现,我想知道两件事

时间:2012-04-10 08:35:47

标签: c++

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

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

1 个答案:

答案 0 :(得分:2)

这些是两个无关的问题。

首先,有各种解决方案。也许是最常见的 被称为弱符号的东西。粗略地说,编译器 在每个目标文件中生成特定名称下的实例 使用该函数,链接器仅抛出重复项 在最终的节目中保留一个。

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