对于某个对象的唯一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;
}
仅供参考,我read前者不是线程安全的,但我不明白为什么后者也是如此。如果有的话,我更喜欢简单的功能,因为它更简单&短。
答案 0 :(得分:2)
为了使其成为线程安全的,您应该更改为std::atomic<unsigned> mID
,并将您的函数编写为
return mID.fetch_add(1);
您选择哪个版本并不重要,但在我看来,自由功能将是我喜欢的功能,因为它无法访问功能之外的变量。
答案 1 :(得分:1)
不同之处在于静态变量的范围/可见性。一个类成员可以由多个方法共享,方法中的变量不能。
根据数据应尽可能保密的原则,如果满足您的需求,方法中的静态变量会更安全。
有关初始化变量时线程安全性的讨论,请参阅this question.,但使用该变量不是线程安全的,除非您采取一些措施来确保它受到保护(使用和原子(最好是一个简单的值),或用互斥锁保护它(如果有多个数据应该受到保护))