在 C 中,结构的第一个元素与结构本身具有相同的地址。如果第一个元素是 POD,C++ 中的非 POD 结构是否也是如此?
例如,给定以下代码:
struct bar
{
struct bar *p1, *p2;
unsigned char h;
}
struct foo
{
struct bar node;
int a;
private:
int x;
};
int main(void)
{
struct foo A;
struct bar *ptr;
ptr = &A.node;
struct foo *n = ((struct foo*)((char*)(ptr)-(unsigned long)(&((struct foo*)0)->node)));
return 0;
}
我收到“对 NULL 对象的非静态数据成员 'foo::node' 的无效访问......也许 offsetof 宏使用不正确”警告。
我的问题是 - 我可以假设“节点”在 foo 的开头(相同的地址),即使这是一个非 POD 结构?
如果是,我可以使用重新解释演员表,我不会收到任何警告:
struct foo *o = reinterpret_cast<struct foo*>(ptr);
那么,如果 C++ 结构以公共 POD 数据开头,那么第一个元素是否会根据标准共享对象的地址?
谢谢
--edit-- 在没有虚拟方法或超类的类中,假设(第一个成员变量的地址)== this 是否安全?被指出是一个可能的答案。它提到“在没有中间访问说明符的情况下声明的(非联合)类的非静态数据成员被分配,以便后面的成员在类对象中具有更高的地址。”这并没有真正解决是否第一个元素在我的情况下,与对象本身的地址相同。
我认为由于标准没有说明任何内容,我不能假设是这样。我可能需要将结构末尾的对象更改为指针,并根据需要处理分配它们。