【发布时间】:2021-03-11 17:11:17
【问题描述】:
我无法理解以下代码中 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和C2的大小不同?你问为什么sizeof(C)=24而sizeof(C2) == 16? -
@Hammer User.... 这个问题没有多重继承,那是错误的重复。
-
@largest_prime_is_463035818 我想知道的是为什么B的填充保留在C中,而B2的填充没有保留在C2中。
-
this question and accepted answer 更详细地介绍(可能被视为重复)