3

これらは、常に私を悩ませてきた静的ローカルに関する2つの質問であり、決定的な答えが見つかりませんでした:

質問1:

 struct Test
 {
  static inline const char* name()
  {
     static const char* nameValue = "Name of Test";
     return nameValue;
  }
};

このメソッドはインラインであるため、このメソッドを呼び出す各コンパイル単位にこのメソッドのコピーが必要です。ただし、ローカル静的変数のインスタンスは 1 つだけである必要があります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

これらは、実際には無関係な 2 つの質問です。

まず、さまざまなソリューションがあります。おそらく最も頻繁に使用されるのは、弱いシンボルと呼ばれるものです。大まかに言えば、コンパイラは、関数を使用するすべてのオブジェクト ファイルに特定の名前でインスタンスを生成し、リンカーは重複を破棄し、最終的なプログラムに 1 つだけを保持します。

2 番目の場合、通常の解決策は、オブジェクトに関連付けられたブール変数を生成し、オブジェクトがスコープに入ったときにこれをテストすることです。

于 2012-04-10T08:41:24.553 に答える