在C中,结构的第一个元素与结构本身具有相同的地址。如果第一个元素是POD,那么对于C++中的非POD结构也是如此?C++ Non-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对象非静态数据成员‘富::节点’无效访问......也许错误地使用了offsetof宏”警告。
我的问题是这样的 - 我可以假设'node'在foo(同一地址)的开头,即使这是一个非POD结构?
如果是的话,我可以只使用一个重新解释施放,我没有得到任何警告:
struct foo *o = reinterpret_cast<struct foo*>(ptr);
所以,如果C++结构与公共POD数据开始,对象将在第一元件共享地址每个标准?
感谢
- 编辑 - In a class with no virtual methods or superclass, is it safe to assume (address of first member variable) == this?指出作为一个可能的答案。它提到“在没有插入访问说明符的情况下声明的(非联合)类的非静态数据成员被分配,以便后来的成员在类对象中拥有更高的地址。”这并不真正解决第一个元素在我的情况下是与对象本身相同的地址。
我觉得既然标准没有对它说什么,我不能认为是这样。我可能需要将结构末尾的对象更改为指针,并根据需要处理它们的分配。
在C++中,'struct'不需要用于声明类型结构的一个变量。 –
从[cppreference](http://en.cppreference.com/w/cpp/language/data_members):*“与不同的访问控制成员在未指定的顺序分配(编译器可组在一起)” * - 使得应该意味着你不能保证'bar'被分配为第一个成员 – UnholySheep
'struct'可能有虚拟表指针,并且与我在开始的某个平台上所知道的匹配。所以不行。 – Slava