是什么导致继承和成员之间的结构大小不同?
What causes difference of size of structs between inheritance and member?
我无法理解以下代码中 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的padding保留了,但是在C2里,好像结构B2的padding被packed了。造成这种差异的原因是什么? (C++标准中有定义吗?是什么规则?)
C++ 允许派生 class 中引入的子对象与基础子对象重叠(填充),只要这些对象不是标准布局即可。它不允许成员子对象之间有任何重叠,也不允许标准布局基础子对象重叠。
查看 struct B
的大小和布局以了解为什么 struct C
具有内部填充。
我无法理解以下代码中 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的padding保留了,但是在C2里,好像结构B2的padding被packed了。造成这种差异的原因是什么? (C++标准中有定义吗?是什么规则?)
C++ 允许派生 class 中引入的子对象与基础子对象重叠(填充),只要这些对象不是标准布局即可。它不允许成员子对象之间有任何重叠,也不允许标准布局基础子对象重叠。
查看 struct B
的大小和布局以了解为什么 struct C
具有内部填充。