繁体   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