函数内部的静态变量与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);

你选择哪个版本并不重要,尽管在我看来,我更喜欢自由函数,因为不可能访问函数之外的变量。

区别在于静态变量的范围/可见性。一个类成员可以由多个方法共享,但方法中的变量不能共享。

根据数据应尽可能私有的原则,如果方法中的静态变量满足您的需求,它会更安全。

有关初始化变量时线程安全性的讨论,请参阅此问题。,但是使用该变量不是线程安全的,除非您采取一些步骤来确保它受到保护(use和atomic(对于简单值来说是首选),或者用互斥(如果有多个数据应该受到保护)来保护它)

最新更新