C++标准是否规定直接成员与继承成员结构体的sizeof相等?
C++标准对两种结构体sizeof是否相等的规定
先看你给出的两个结构体定义:
第一种结构体:
struct AB { int a; int b; };
第二种继承结构:
struct A { int a; }; struct B : public A { int b; };
关于sizeof(AB) == sizeof(B)是否成立,C++标准没有强制要求两者必须相等,但在绝大多数常见的编译器实现中,这个等式是成立的。
具体细节:
struct AB的大小是两个int的大小加上必要的对齐填充。由于int的对齐要求通常等于自身大小,所以sizeof(AB)一般就是2 * sizeof(int)。struct B继承自A,A包含一个int,B额外添加一个int。C++标准允许编译器为了对齐或其他实现需求在派生类中插入填充字节,但在常规场景下,编译器不会在基类子对象和派生类成员之间添加额外填充,因此sizeof(B)也会等于2 * sizeof(int),此时两者相等。
需要注意的例外情况:
- 标准并未禁止编译器插入额外填充,虽然这种情况在
int成员的常规场景下几乎不会出现。比如某些特殊平台或自定义对齐规则下,可能导致sizeof(B)大于sizeof(AB)。 - 这里的基类
A不是空类,所以空基类优化(EBO)不适用——如果基类是空类,标准允许编译器优化掉基类的占位字节,但这个场景不涉及。
总结:主流编译器默认实现中两者大小相等,但标准没有强制保证,理论上存在不相等的可能(非常罕见)。
内容的提问来源于stack exchange,提问作者Boris
相关产品推荐
相关产品推荐

