C++ 关于对象内存布局的假设

C++ 关于对象内存布局的假设,c++,c++11,c++14,C++,C++11,C++14,以下假设对哪些类型(标准布局、POD、普通类型、对齐约束等)有效 B是a的子类,B*B是指向B对象的指针 A*A=b与b具有相同的地址,即 static_cast<A*>(b) == reinterpret_cast<A*>(b) offset of可用于从B访问A和B的数据成员: int i = *static_cast<int*>( reinterpret_cast<unsigned char*>(b) + offsetof(B,

以下假设对哪些类型(标准布局、POD、普通类型、对齐约束等)有效

B
a
的子类,
B*B
是指向
B
对象的指针

  • A*A=b
    b
    具有相同的地址,即

    static_cast<A*>(b) == reinterpret_cast<A*>(b)
    
  • offset of
    可用于从
    B
    访问
    A
    B
    的数据成员:

    int i = *static_cast<int*>(
        reinterpret_cast<unsigned char*>(b) + offsetof(B, m_i));
    
    inti=*静态(
    重新解释(b)+偏移(b,m_i));
    

  • 编辑:将指针算法的
    void*
    更改为
    unsigned char*
    (以1字节为单位)

    如果
    A
    B
    都是标准布局,并且
    B
    指向类
    B
    的最派生对象,则第一个断言应为真

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

    问题的第二点适用于任何类型的
    B
    ,因为数组就是这样定义的

    int i = *static_cast<int*>(
        reinterpret_cast<unsigned char*>(b) + offsetof(B, m_i));