c++ - 是什么导致继承和成员之间的结构体大小不同?

标签 c++ sizeof

我无法理解以下代码中 C 和 C2 大小不同的原因:

#include <iostream>

struct A {
    int* x;
};

struct B {
    A a;
    int y;
};

struct C : B {
   int z;
};

struct B2 : A {
   int y;
};

struct C2 : B2 {
   int z;
};
    
int main()
{
    std::cout << sizeof(A) << std::endl; // 8
    std::cout << sizeof(B) << std::endl; // 16
    std::cout << sizeof(C) << std::endl; // 24
    std::cout << sizeof(B2) << std::endl; // 16
    std::cout << sizeof(C2) << std::endl; // 16
}

https://wandbox.org/permlink/GEWj2LQxloC34lNS

我(可能)理解的是,

  • C 具有以下内存布局
|0      |4      |8      |12     |16      |20     |
|A::x-----------|B::y---|padding|C::z----|padding|
  • C2 具有以下内存布局。
|0      |4      |8      |12      |
|A::x-----------|B::y---|C::z----|

在C中,结构B的填充似乎保留下来,但在C2中,结构B2的填充似乎被打包了。造成这种差异的原因是什么? (C++标准里有定义吗?是什么样的规则?)

最佳答案

C++ 允许派生类中引入的子对象与基子对象重叠(填充),只要这些对象不是标准布局即可。它不允许成员子对象之间有任何重叠,也不允许标准布局基础子对象重叠。

查看 struct B 的大小和布局,了解为什么 struct C 具有内部填充。

关于c++ - 是什么导致继承和成员之间的结构体大小不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66587269/

相关文章:

c - sizeof(array_of_char) 输出奇怪的数字

c - 查找结构的大小

c++ - 为什么 ld 链接器允许使用相同方法定义多个类?

c++ - 如何正确跳过 unicode (UTF-8) 字符?

c++ - 快速排序显然是选择o(n^2)当左或最右元素作为枢轴时

c++ - 为什么 std::function 实例有默认构造函数?

c - C中多维数组的内部数组的元素数

c++ - 不同编译器中的指针大小

c++ - 在 HPUX 上以编程方式获取应用程序的 CPU 和内存使用情况

c++ - unsigned关键字会影响sizeof的结果吗?