2016-05-04 219 views
1

對於某個對象的唯一標識,我可以用兩種方法創建計數器,但我不知道哪一個更好雖然它們在代碼中有很大不同不是字節碼,我不知道)。函數內的靜態變量vs C++中的靜態類變量

第一種方法是將有它使用一個靜態變量一些功能:

部首:

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; 
} 

僅供參考,我已經read前者不是線程安全的,但我不明白爲什麼後者將是要麼。如果有的話,我更喜歡簡單的功能,因爲它更簡單,更簡單&。

+4

FWIW,你說得對。這兩個實現都不是線程安全的。 –

+0

只是爲了讓它更清楚,因爲人們關注線程安全(如果我的問題很模糊,我很抱歉):我在問爲什麼兩種方法都會更好。如果他們只是線程不安全,那麼線程安全不應該進入討論。 – ikku100

回答

1

區別在於靜態變量的範圍/可見性。類成員可以被多個方法共享,方法中的變量不能。

根據數據應該儘可能私有的原則,如果方法中的靜態變量滿足您的需求,則該方法中的靜態變量更安全。

爲了線程安全的討論時初始化變量,看this question.,但使用的變量不是線程安全的,除非你採取一些步驟,以確保它是受保護的(無論是使用和原子(最好爲一個簡單的值),或用互斥鎖保護它(如果數據超過一件應該受到保護))

2

要使它線程安全的,你應該更改爲std::atomic<unsigned> mID,寫你的函數作爲

return mID.fetch_add(1); 

你選擇哪個版本應該不重要,一個雖然在我看來,自由函數會是我喜歡的函數,因爲不可能在函數之外訪問變量。