【发布时间】:2016-12-19 11:55:08
【问题描述】:
需要为类数据成员生成唯一键。因此,我正在考虑获取变量地址减去类对象地址之间的差异。例如:
struct X {
int i; // &i - &X() = 0 (GCC)
double d; // &d - &X() = 8 (GCC)
};
这是一次性练习,因此将在所有感兴趣的类的代码执行的最开始进行。所以通常我会声明一个类的虚拟对象并通过类型转换找到地址差异。如:
X x;
keyOf_i = long(&x.i) - long(&x);
keyOf_d = long(&x.d) - long(&x);
有没有更好的办法?
假设访问说明符 (private) 不是问题。
如果有人有任何其他方法来为类数据变量生成唯一键,除了这种方式,也会感兴趣。
更新:使用 offseof() 宏,我在 G++-6 中收到以下警告:
非标准布局类型“MyClass”中的偏移量未定义
实际上,MyClass 中还有一些字符串和其他类变量。我很好,即使这个未定义的东西给出了唯一的地址。但是,想获得更多关于offsetof() 和其他替代方案的信息。
【问题讨论】:
-
@iammilind 我想不出有什么不同的答案,
offsetof是非标准布局的未定义行为 -
@SamVarshavchik,Danh 您能否详细说明“标准布局类型”。在什么样的情况下,这种差异会失效?我认为,类对象的地址与其数据成员的地址之间的差异始终保持不变。这种差异何时会变得不确定?顺便说一句,我对这样的准确差异不感兴趣。相反,我只对班级所有变量的独特差异感兴趣。请提出建议。
-
谷歌搜索“指向成员”。指向成员的指针是一种允许您访问结构或类实例的某些成员的东西,如果您也获得了指向实例的指针。
-
您可能想使用 uintptr_t 来确保指针适合整数。
标签: c++ c++11 memory-address unique-key datamember