c++ - 使用 (void*) 作为标识符的一种类型

标签 c++ identity strict-aliasing

在我的程序中,我有一些对象(属于同一类)必须全部具有唯一标识符。为了简单和性能,我选择使用对象的地址作为标识符。为了保持类型简单,我使用 (void*) 作为此标识符的类型。最后我有这样的代码:

class MyClass {
public:
  typedef void* identity_t;
  identity_t id() const { return (void*)this; }
}

这似乎工作正常,但 gcc 给了我一个严格的别名警告。我知道如果将 id 用于数据传输,代码会很糟糕。幸运的是它不是,但问题仍然存在:别名优化是否会对生成的代码产生影响?以及如何避免警告?

注意:我不愿意使用(char*),因为这意味着用户可以使用数据进行复制,而事实并非如此!

最佳答案

您可以尝试使用类型 uintptr_t 而不是 void*uintptr_t 是一个整数类型,被定义为大到足以容纳任何指针值。由于它实际上不是指针,因此编译器不会标记任何别名问题。

class MyClass {
public:
    typedef uintptr_t identity_t;
    identity_t id() const { return (identity_t)this; }
}

关于c++ - 使用 (void*) 作为标识符的一种类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1865652/

相关文章:

c++ - 签名/未签名别名规则是否按预期工作?

c++ - std::pair 的这个 const 引用是如何工作的?

c++ - VS2012 不编译此代码,但 G++、clang 和 ICC 都在没有诊断的情况下接受它

c++ - C++ 库的 Tcl/Tk GUI 界面

sql - 删除行后重用标识值

session - AZURE ACS 将身份与多个登录关联起来

c# - 身份:为什么 user.roles 是空的?

c++ - 如何应对高频数据?

c++ - FlatBuffers 是否以某种方式避免了严格的别名?

visual-c++ - Visual C++ 支持 "strict aliasing"吗?