[英]Using the static keyword to initialize a class, a variable vs a function in C++
[英]static variable inside function vs static class variable in c++
對於某個對象的唯一id,我可以用兩種方式創建一個計數器,但我不知道哪一個更好,而它們在代碼上完全不同(盡管可能不是字節代碼,我不知道)。
第一種方法是使用一些使用靜態變量的函數:
標題:
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;
}
僅供參考,我讀過前者不是線程安全的,但我不明白后者為什么會這樣。 如果有的話,我更喜歡簡單的功能,因為它更簡單,更短。
要使其成為線程安全的,您應該更改為std::atomic<unsigned> mID
,並將您的函數編寫為
return mID.fetch_add(1);
您選擇哪個版本無關緊要,但在我看來,自由函數將是我更喜歡的版本,因為它無法訪問函數之外的變量。
不同之處在於靜態變量的范圍/可見性。 一個類成員可以由多個方法共享,方法中的變量不能。
根據數據應盡可能私有的原則,如果滿足您的需求,方法中的靜態變量更安全。
有關初始化變量時線程安全性的討論,請參閱此問題。 ,但使用該變量不是線程安全的,除非您采取一些措施來確保它受到保護(使用和原子(首選為簡單值),或使用互斥鎖保護它(如果有多個數據,應該受到保護))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.