c++ - 对象内存布局的假设

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

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

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

  1. A* a = bb 有相同的地址,即

    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 可用于从 b 访问 AB 的数据成员:

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

编辑:将 void* 更改为 unsigned char* 用于指针运算(以 1 字节为单位)

最佳答案

如果AB都是标准布局和b指向类 B 的最派生对象, 那么第一个断言应该是真的。

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

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

关于c++ - 对象内存布局的假设,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34578601/

相关文章:

C++ 通用包装器类,它为某些函数添加了额外的处理

c++ - 在类成员中正确使用 unique_ptr

c++ - 在没有隐式转换的情况下在编译时检测运算符

来自二维数组的 C++ 16 位灰度渐变图像

c++ - 在 C++ 中,(int *) 和 & 有什么区别?

c++ - Visual C++ 初始化与 gcc 和 clang 不一致

c++ - 包装函数指针和函数对象如何在通用代码中工作?

c++ - 避免在字符串中进行 if-else 分支以进行类型调度

c++ - C++中的简单探路者

c++ - 如何有效/正确地存储等距游戏的不同类(单个父类(super class)的所有子类型)的 map ?