C++ シンギュルトンパターンの最適化方法

C++において、シングルトンパターンは以下で最適化されています。

  1. さぼり屋の改善:さぼり屋のシングルトン模式は、シングルトンオブジェクトが必要になったときにのみ作成されますが、毎回シングルトンオブジェクトを取得するには、スレッド同期判断とロック操作を実行する必要があります。二重チェックロッキング方式最適化を使用できます。つまり、ロックの前後で2回判断を行います。最初の判断は不要なロック操作を回避するためであり、2番目の判断は最初の判断に合格した後、複数のスレッドが同時にインスタンスを作成することを回避するためです。具体的なコードは次のとおりです。
class Singleton {
private:
static Singleton* instance;
static std::mutex mtx;
Singleton() {}
Singleton(const Singleton& other) = delete;
Singleton& operator=(const Singleton& other) = delete;
public:
static Singleton* getInstance() {
if (instance == nullptr) {
std::lock_guard<std::mutex> lock(mtx);
if (instance == nullptr) {
instance = new Singleton();
}
}
return instance;
}
};
Singleton* Singleton::instance = nullptr;
std::mutex Singleton::mtx;
  1. 遅延初期化のハンガー法: ハンガー法シングルトンモードは、クラスをロードするとシングルトンオブジェクトを生成するが、プログラムの起動が遅くなる可能性があります。静的なローカル変数を使用する方法を最適化できます。静的なローカル変数は、関数が最初に呼び出されたときに初期化され、プログラムの起動時にシングルトンオブジェクトを作成するオーバーヘッドを回避します。具体的なコードは次のとおりです。
class Singleton {
private:
Singleton() {}
Singleton(const Singleton& other) = delete;
Singleton& operator=(const Singleton& other) = delete;
public:
static Singleton* getInstance() {
static Singleton instance;
return &instance;
}
};
  1. メイヤーズ・シングルトン:メイヤーズ・シングルトンは、C++11 標準で導入された、スレッドセーフなシングルトンパターン実装方法の 1 つです。静的ローカル変数の特性を活用することで、インスタンスが 1 つしか作成されず、マルチスレッド環境でも安全なことを保証します。コードを次に示します。
class Singleton {
private:
Singleton() {}
Singleton(const Singleton& other) = delete;
Singleton& operator=(const Singleton& other) = delete;
public:
static Singleton* getInstance() {
static Singleton instance;
return &instance;
}
};

C++のシングルトンパターンを最適化する手法にはさまざまなものがあり、どれを選択するかは具体的なニーズとユースケースに依存します。

bannerAds