C++20中仅含单一基础类型成员的标准布局类,其大小是否被标准保证与成员类型大小相等?
C++20中仅含单一基础类型成员的标准布局类,其大小是否被标准保证与成员类型大小相等?
好问题!咱们来拆解C++20标准里的相关规则,给你一个确定的答案。
首先先确认你的前提:class A{ int v; }; 确实是标准布局类(std::is_standard_layout_v<A>为true),而且&a == &a.v的行为是标准明确保证的——这是标准布局类的核心特性:第一个非静态数据成员的地址和类对象的地址完全重合。
回到你最关心的点:sizeof(A) == sizeof(int)是被C++20标准严格保证的,具体依据和原因如下:
- 你的类
A是非空类,仅包含一个非静态、非位域的基础类型成员,既没有虚函数、虚基类,也没有继承任何基类,是标准布局类的最简合法形式。 根据C++20标准中[class.mem]和[basic.types.general]的相关条款:对于这类仅含单个非静态非位域成员的非空标准布局类,类的大小恰好等于该成员的大小。因为此时类不需要额外的填充字节——既没有其他成员需要对齐的需求,也没有虚表指针、基类填充等额外开销,标准明确要求类的大小只需容纳这唯一的成员即可。
- 你观察到GCC和Clang中这个等式成立,这不是编译器的特殊实现,而是它们严格遵循了标准要求,任何符合C++20标准的编译器都必须保证这一点。
这里需要提一个小例外:如果类继承了空基类(比如struct B {}; struct A : B { int v; };),此时sizeof(A)可能会大于sizeof(int)(空基类可能被分配1字节的填充),但你的例子里A没有基类,所以完全不用考虑这种情况。
内容来源于stack exchange
相关产品推荐
相关产品推荐

