1

对于某个对象的唯一 ID,我可以通过两种方式创建一个计数器,但我不知道哪个更好,因为它们在代码中完全不同(尽管可能不是字节码,我不知道)。

第一种方法是使用一些使用静态变量的函数:

标题:

unsigned int GetNextID();

cp:

unsigned int GetNextID()
{
    static unsigned id{0};
    return id++;
}

另一种选择:

标题:

class UniqueIdGenerator
{
public:
    static unsigned int GetNextID();

private:
    static unsigned int mID;
}

cp:

unsigned int UniqueIdGenerator::mID = 1;

unsigned int UniqueIdGenerator::GetNextID()
{
    return ++mID;
}

仅供参考,我读过前者不是线程安全的,但我不明白为什么后者也是。如果有的话,我更喜欢简单的功能,因为它更简单、更短。

4

2 回答 2

2

为了使其线程安全,您应该更改为std::atomic<unsigned> mID,并将您的函数编写为

return mID.fetch_add(1);

您选择哪个版本无关紧要,尽管在我看来免费函数将是我更喜欢的版本,因为无法访问函数外部的变量。

于 2016-05-04T16:04:34.793 回答
1

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

在数据尽可能私有的原则下,方法中的静态变量如果满足你的需要,会更安全。

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

于 2016-05-04T16:03:50.263 回答