簡體   English   中英

函數內部的靜態變量與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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM