函数内部的静态变量与 C++ 中的静态 class 变量
static variable inside function vs static class variable in c++
对于某些 object 的唯一 ID,我可以通过两种方式创建计数器,但我不知道 哪个更好 虽然它们在代码(虽然可能不是字节码,我不知道)。
第一种方法是使用一些使用静态变量的函数:
Header:
unsigned int GetNextID();
cpp:
unsigned int GetNextID()
{
static unsigned id{0};
return id++;
}
其他选项:
Header:
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 前者不是线程安全的,但我不明白为什么后者也是。如果有的话,我更喜欢简单的功能,因为它更简单、更短。
区别在于静态变量scope/visibility。一个 class 成员可以被多个方法共享,方法中的变量不能。
本着数据尽可能私有的原则,方法中的静态变量满足你的需求更安全。
有关初始化变量时线程安全的讨论,请参阅this question.,但使用变量不是线程安全的,除非您采取一些步骤来确保它受保护(使用和原子(首选简单值),或使用互斥锁保护它(如果应该保护不止一个数据))
要使其成为线程安全的,您应该更改为 std::atomic<unsigned> mID
,并将您的函数编写为
return mID.fetch_add(1);
您选择哪个版本并不重要,尽管在我看来自由函数是我更喜欢的版本,因为它无法访问函数外部的变量。
对于某些 object 的唯一 ID,我可以通过两种方式创建计数器,但我不知道 哪个更好 虽然它们在代码(虽然可能不是字节码,我不知道)。
第一种方法是使用一些使用静态变量的函数:
Header:
unsigned int GetNextID();
cpp:
unsigned int GetNextID()
{
static unsigned id{0};
return id++;
}
其他选项:
Header:
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 前者不是线程安全的,但我不明白为什么后者也是。如果有的话,我更喜欢简单的功能,因为它更简单、更短。
区别在于静态变量scope/visibility。一个 class 成员可以被多个方法共享,方法中的变量不能。
本着数据尽可能私有的原则,方法中的静态变量满足你的需求更安全。
有关初始化变量时线程安全的讨论,请参阅this question.,但使用变量不是线程安全的,除非您采取一些步骤来确保它受保护(使用和原子(首选简单值),或使用互斥锁保护它(如果应该保护不止一个数据))
要使其成为线程安全的,您应该更改为 std::atomic<unsigned> mID
,并将您的函数编写为
return mID.fetch_add(1);
您选择哪个版本并不重要,尽管在我看来自由函数是我更喜欢的版本,因为它无法访问函数外部的变量。