ホームページ >バックエンド開発 >C++ >Meyers の Lazy Initialized Singleton 実装は本当にシングルトンですか?

Meyers の Lazy Initialized Singleton 実装は本当にシングルトンですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-12 17:33:11196ブラウズ

Is Meyers' Lazy Initialized Singleton Implementation Truly a Singleton?

Meyers のシングルトン実装: シングルトン性の解明

質問:

Meyers のシングルトンの実装はどうですか?以下に示すように、C でのシングルトンの遅延初期化実装は、実際にはシングルトン パターン?

static Singleton& instance()
{
     static Singleton s;
     return s;
}

答え:

Meyers の実装のシングルトン性を理解するには、重要な特性である 静的ストレージ期間を認識することが重要です。

C では、関数内で宣言されたローカル変数は、次の場合に静的記憶域期間を持ちます。それらは静的として宣言されます。これは、関数が何回呼び出されたかに関係なく、プログラム全体でその変数のインスタンスが 1 つだけ存在することを意味します。

Meyers の実装では、静的な Singleton 変数には静的な保存期間があります。したがって、シングルトン パターンを適用するシングルトンのインスタンスは 1 つだけ作成できます。

より明確に理解するために、内部のコードを詳しく見てみましょう。

// Global guard variable
static bool __guard = false;

// Static storage for the Singleton
static char __storage[sizeof(Singleton)];

Singleton& Instance() {
  if (!__guard) {
    __guard = true;
    new (__storage) Singleton();
  }
  return *reinterpret_cast<Singleton*>(__storage);
}

この実装は次のとおりです。 Meyers の元の提案に似ていますが、スレッド セーフティ メカニズムが含まれています。 __guard 変数は、複数のスレッドから同時にアクセスされた場合でも、シングルトンが 1 回だけ初期化されることを保証します。

他の実装との比較:

他のシングルトン実装と比較すると、Meyers ' バージョンには次の利点があり、短所:

長所:

  • シンプルで効果的: シンプルなので、理解と実装が簡単です。
  • スレッドセーフ: 実装には同時アクセスを処理するメカニズムが含まれています

短所:

  • 遅延初期化: シングルトンは最初に要求されたときにのみ作成されるため、問題が発生する可能性があります。パフォーマンスのオーバーヘッド。
  • 破壊の可能性問題点: シングルトンは静的であるため、必要がなくなってもすぐに破棄されず、メモリ リークが発生する可能性があります。

結論:

Meyers の遅延初期化シングルトン実装では、静的ストレージ期間を活用して、プログラム全体でシングルトンのインスタンスが 1 つだけ存在するようにし、それを有効なシングルトンにします。 パターン。他の実装はパフォーマンスやメモリ管理の点で利点を提供する可能性がありますが、Meyers のバージョンは依然として信頼性が高く、広く使用されているシングルトン設計です。

以上がMeyers の Lazy Initialized Singleton 実装は本当にシングルトンですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。