これらは、常に私を悩ませてきた静的ローカルに関する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() の最初の呼び出しをどのように認識しますか? これがこの関数の最初の呼び出しであるかどうかにかかわらず、実行時にフラグを維持しますか?