3

extern キーワードを使用した外部リンケージがあるとします。

私は(class1.cppに)持っています:

MyClass* myClassVar = NULL;

コンストラクタは上記を初期化し、デストラクタは削除します。

次に、class2.cpp と class3.cpp には次のものがあります。

extern MyClass* myClassVar;

これらのクラスは myClassVar を使用します (通常の null チェックなどを行います)。

シングルトンが優先されますか? (グローバルが悪いことなどを知っています。シングルトンは単なる構文糖です)。上記のコードを以下に変更する利点はありますか?

static Singleton& getInstance()
{
   static Singleton instance;

   return instance;
}

次に、すべてのクラスが行います。

Singleton::getInstance()
4

2 に答える 2

7

グローバル変数は、初期化順序の失敗に悩まされています。個別の翻訳単位のグローバルは不特定の順序で初期化されるため、コンストラクターで別のグローバルを参照すると、未定義の動作が発生します。

関数スコープ内の静的変数は、関数が最初に呼び出されたときに初期化されます。これにより、(多かれ少なかれ) 初期化順序の問題が解決されます。

ただし、より微妙な問題が残っています。特に、オブジェクトが破棄された後でもオブジェクトにアクセスすることは可能であり、スレッドセーフな初期化を保証するためにいくらかのオーバーヘッドがあります (古いコンパイラでは、初期化がスレッドセーフではない場合があります)。自明ではない型のグローバルにアクセス可能なオブジェクトを管理するための完全に安全な方法はありません。私のアドバイスは、可能であればそれらを完全に避けることです。

于 2012-09-03T12:35:27.103 に答える
4

あらゆるタイプのグローバルの失敗をすでに知っていると言うので、唯一の利点は、externその種類の複数の変数を同様に定義できる を使用するのではなく、クラスのインスタンスを 1 に制限することです。

于 2012-09-03T12:31:37.413 に答える