对对象的内存布局的假设

时间:2016-01-03 16:09:41

标签: c++ c++11 c++14

对于哪些类别的类型(标准布局,POD,普通类型,对齐约束......),以下假设是否有效?

BA的子类,B* b是指向B对象的指针。

  1. A* a = b的地址与b相同,即

    static_cast<A*>(b) == reinterpret_cast<A*>(b)
    
  2. B bs[n]B个对象的数组。

    &bs[i] == static_cast<B*>(reinterpret_cast<unsigned char*>(bs) + i * sizeof(B))
    
  3. offsetof可用于从A访问Bb的数据成员:

    int i = *static_cast<int*>(
        reinterpret_cast<unsigned char*>(b) + offsetof(B, m_i));
    
  4. 编辑:将void*更改为unsigned char*以进行指针运算(以1个字节为单位)

1 个答案:

答案 0 :(得分:4)

如果AB都是标准布局,b指向类B的派生程度最高的对象,则第一个断言应为true。< / p>

offsetof宏可用于标准布局类型的成员。

对于任何类型B,问题的第二点都是正确的,因为这就是数组的定义方式。