2016-05-04 25 views
1

一部のオブジェクトの一意のIDの場合は、2つの方法でカウンタを作成できますが、わかりませんどちらが良いかコードはかなり異なりますバイトコードではない、私は考えていない)。関数内静的変数と静的クラス変数の比較

ヘッダー:

unsigned int GetNextID(); 

CPP:

unsigned int GetNextID() 
{ 
    static unsigned id{0}; 
    return id++; 
} 

他のオプション:

ヘッダー

最初の方法は、静的変数を使用して、いくつかの機能を持っているだろう:

class UniqueIdGenerator 
{ 
public: 
    static unsigned int GetNextID(); 

private: 
    static unsigned int mID; 
} 

CPP:

unsigned int UniqueIdGenerator::mID = 1; 

unsigned int UniqueIdGenerator::GetNextID() 
{ 
    return ++mID; 
} 

FYI、私は前者はスレッドセーフではないが、後者はどちらかだろう、なぜ私は見ていないことreadをしました。何かあれば、シンプルな機能がもっと好きです。簡略化すると、&が短くなります。

+4

FWIW、そうです。いずれの実装もスレッドセーフではありません。 –

+0

何らかの理由でスレッドの安全性に重点を置いているからです(私の質問があいまいであれば申し訳ありません)。なぜどちらの方が良いか尋ねています。それらがスレッドと同じように安全でない場合、スレッドの安全性は議論に入るべきではありません。 – ikku100

答えて

1

違いは、静的変数のスコープ/可視性です。クラスメンバを複数のメソッドで共有することはできますが、メソッドの変数は共有できません。

データはできるだけプライベートである必要がありますが、メソッドの静的変数は必要に応じて安全です。スレッドの安全性の議論については

が変数を初期化し、this question.を参照してください、しかし、あなたはそれが保護されていることを保証するためにいくつかのステップを取る(いずれかを使用し、アトミックない限り、変数を使用すると、スレッドセーフではありません(単純な値には好ましいです)、または保護すべきデータの複数枚))

2

が、それはスレッドセーフあなたはstd::atomic<unsigned> mIDに変更する必要が作る、そしてあなたの関数を書くがある場合(ミューテックスで保護

return mID.fetch_add(1); 
として

あなたが選んだバージョンは問題ではありません。私の意見では、自由な関数は、関数の外部の変数にアクセスすることができないので、私が好むものです。

関連する問題