对于哪些类别的类型(标准布局、POD、普通类型、对齐约束...),以下假设有效?
B
是 A
的子类,B* b
是指向 B
对象的指针。
A* a = b
与b
有相同的地址,即static_cast<A*>(b) == reinterpret_cast<A*>(b)
B bs[n]
是B
对象的数组。&bs[i] == static_cast<B*>(reinterpret_cast<unsigned char*>(bs) + i * sizeof(B))
offsetof
可用于从b
访问A
和B
的数据成员:int i = *static_cast<int*>( reinterpret_cast<unsigned char*>(b) + offsetof(B, m_i));
编辑:将 void*
更改为 unsigned char*
用于指针运算(以 1 字节为单位)
最佳答案
如果A
和 B
都是标准布局和b
指向类 B
的最派生对象, 那么第一个断言应该是真的。
offsetof
宏可用于标准布局类型的成员。
问题的第二点对于任何类型都是正确的 B
因为这就是数组的定义方式。
关于c++ - 对象内存布局的假设,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34578601/