在类中,私有成员是与公共成员分配在单独的内存中,还是所有成员都按照其定义的顺序分配?
例如,
class A {
private:
int a1;
int a2:3;
public:
int z;
int a3:2;
int a4:5;
private:
int a5:2;
}
Are a1
, a2
, and a5
组合在一起进行内存分配或者只是简单地a1
, a2
, a3
, a4
, a5
?
如果发生聚群,在位字段的情况下可能会改变类的大小。
- 在给定的可访问性块内,保留成员的顺序,但在 C++03 中未指定可访问性块之间的成员顺序。这意味着 a1、a2、a5、z、a3、a4 在上面的示例中是有效的顺序。
- 在 C++11 中,这一点得到了加强,具有相同可访问性的成员必须按声明的顺序放置。 (例如,这会在您的示例中禁止 a5 a1 a2 f a3 a4,因为在您的示例中 a5 是在 a1 和 a2 之后声明的)具有不同可访问性的成员之间的顺序未指定。
- 编译器可以在任何成员之间插入填充(例如为了保持对齐)
- 位域的表示形式未指定。它们可以按任何顺序放置,并且不遵守任何先前的规则。因为您无法获取位字段的地址,所以没有机制可以观察这一点。
具体标准参考(重点是我的):
C++03 9.2 [class.mem]/12:
(非联合)类的非静态数据成员声明时没有介入访问说明符进行分配,以便后面的成员在类对象中具有更高的地址。由访问说明符分隔的非静态数据成员的分配顺序未指定 (11.1)。实现对齐要求可能会导致两个相邻成员不能立即分配;管理虚拟函数 (10.3) 和虚拟基类 (10.1) 的空间要求也可能如此。
N3376(C++11 后的第一个草案)9.2 [class.mem]/13:
(非联合)类的非静态数据成员具有相同的访问控制(第 11 条)被分配,以便后面的成员在类对象中具有更高的地址。具有不同访问控制的非静态数据成员的分配顺序是未指定的。实现对齐要求可能会导致两个相邻成员不能立即分配;管理虚拟函数 (10.3) 和虚拟基类 (10.1) 的空间要求也可能如此。
N3376 9.6 [类位]/1:
[...] 类对象内位域的分配是实现定义的。位字段的对齐是实现定义的。 [...]
/3:
[...] 地址运算符 & 不得应用于位域,因此不存在指向位域的指针。 [...]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)