我有几个对象,需要为它们生成一个唯一标识符,在每个对象的生命周期内不会更改/重复。
基本上我想要获得/生成我的对象的唯一标识符,类似于这样
int id = reinterpret_cast<int>(&obj);
int id = (int)&obj;
我明白上面的代码是个坏主意,因为 int 可能不够大来存储地址等信息。
那么,获取对象的唯一标识符的最佳实践是什么,这将是一个可移植的解决方案?
我有几个对象,需要为它们生成一个唯一标识符,在每个对象的生命周期内不会更改/重复。
基本上我想要获得/生成我的对象的唯一标识符,类似于这样
int id = reinterpret_cast<int>(&obj);
int id = (int)&obj;
我明白上面的代码是个坏主意,因为 int 可能不够大来存储地址等信息。
那么,获取对象的唯一标识符的最佳实践是什么,这将是一个可移植的解决方案?
根据您对“唯一性”的要求,有几种选择:
就我个人而言,每当我负担得起时,我的选择总是UUID,因为它们为我提供了一些放心,不必考虑所有的陷阱。
struct Obj
{
int _id;
Obj() { static int id = 0; _id = id++; }
};
你需要决定如何处理副本/分配(相同id - 上述方法可行 / 不同id的话 - 你需要一个复制构造函数和可能是静态类成员而不是静态局部变量)。
class
Indexed
{
public:
Indexed() :
m_myIndex( m_nextIndex++ )
{ }
int getIndex() const
{ return m_myIndex; }
private:
const int m_myIndex;
static int m_nextIndex;
};
使用对象地址作为唯一标识符似乎不是一个坏主意。为什么要将其强制转换为整数?只需使用==
比较指针即可:
MyObject *obj1, *obj2;
...
if (obj1 == obj2) ...
当然,如果您需要将 ID 写入数据库或类似情况,则此方法无效。指针的相同值在多次运行之间是可能的。另外,请不要重载比较操作符(==
)。
obj1 == obj2
是未定义行为。 - Luchian Grigore// 在此处执行更多操作...
。 - Agentlien
uintptr_t
是足够大的整数类型。 - jthill