私の具体的な質問は、C ++でシングルトンクラスを実装する場合、パフォーマンス、副次的な問題などに関して、以下の2つのコードの間に実質的な違いがあるかどうかです。
class singleton
{
// ...
static singleton& getInstance()
{
// allocating on heap
static singleton* pInstance = new singleton();
return *pInstance;
}
// ...
};
この:
class singleton
{
// ...
static singleton& getInstance()
{
// using static variable
static singleton instance;
return instance;
}
// ...
};
(ヒープベースの実装での逆参照はパフォーマンスに影響を与えないことに注意してください。AFAIKでは逆参照用に生成された追加のマシンコードはありません。ポインターと区別するのは構文の問題のようです。)
アップデート:
ここに要約しようとしている興味深い回答とコメントがあります。(興味のある方は詳細な回答を読むことをお勧めします。):
- 静的ローカル変数を使用するシングルトンでは、クラスデストラクタはプロセスの終了時に自動的に呼び出されますが、動的割り当ての場合は、スマートポインタを使用するなど、いつかオブジェクトの破棄を管理する必要があります。
static singleton& getInstance() {
static std::auto_ptr<singleton> instance (new singleton());
return *instance.get();
}
動的割り当てを使用するシングルトンは、静的シングルトン変数よりも「遅延」です。後者の場合、シングルトンオブジェクトに必要なメモリは、プロセスの起動時に(プログラムのロードに必要なメモリ全体の一部として)予約されます。 )そしてシングルトンコンストラクターの呼び出しのみが
getInstance()
call-timeに延期されます。sizeof(singleton)
これは、が大きい場合に問題になる可能性があります。どちらもC++11ではスレッドセーフです。ただし、以前のバージョンのC ++では、実装固有です。
動的割り当ての場合は、1レベルの間接参照を使用してシングルトンオブジェクトにアクセスしますが、静的シングルトンオブジェクトの場合は、オブジェクトの直接アドレスが決定され、コンパイル時にハードコーディングされます。
PS:@TonyDの回答に従って、元の投稿で使用した用語を修正しました。