私の具体的な質問は、C++でsingleton classを実装する場合、そこにあるということであるパフォーマンス、サイドの問題や何かについて、コードの下の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;
}
// ...
};
(生成された余分なマシン・コードがない私の知る限りとして、ヒープベースの実装では逆参照すると、パフォーマンスに影響を与えるべきではないことに注意してください逆参照のために。 。私はここでそれらを要約してみてください興味深い回答やコメントを持っている
:それはポインタと区別するための構文の問題だけらしい)
UPDATEです。 (興味のある人のために推奨されている詳細な回答を読む。):動的割り振り場合には、あなたが持っているのに対し、
シングルトンで- 静的ローカル変数を使用して、クラスデストラクタは、プロセス終了時に自動的に起動されオブジェクトの破壊をいつか管理します。
static singleton& getInstance() {
static std::auto_ptr<singleton> instance (new singleton());
return *instance.get();
}
動的割り当てを使用して、シングルトンが後者の場合のように、シングルトンオブジェクトに必要なメモリは(常に、静的シングルトン変数より「lazier」ある:スマートポインタを使用して?)プロセス起動時に(プログラムのロードに必要なメモリ全体の一部として)予約されており、シングルトンコンストラクタの呼び出しだけが
getInstance()
コール時に延期されます。これは、sizeof(singleton)
が大きいときに問題になることがあります。どちらもC++ 11ではスレッドセーフです。しかし、以前のバージョンのC++では、実装固有のものでした。
動的割り当てのケースでは、シングルトンオブジェクトにアクセスするために1レベルの間接参照を使用しますが、スタティックシングルトンオブジェクトの場合は、オブジェクトの直接アドレスが決定され、コンパイル時にハードコードされます。
P.S:私は@のTonyDの回答によると、元の投稿に使用されるのだ用語を修正しました。
生成された2つのアセンブリを比較しましたか? –
いいえ.2つの異なる実装で生成されたアセンブリを意味する場合は、明らかに異なります。ヒープに割り当てられ、ロード/呼び出し時間の初期化が行われるためです。逆参照のための生成されたアセンブリを意味する場合、いいえ、私は比較していません。私はちょうどそう思います。 –