这不是此 question的重复, 我读了答案,我仍然对这个问题有一些疑问。
我测试了一些这样的类:
class A {
private:
int b;
public:
char c;
int a;
private:
char e;
};
我已经看到字段存储就像没有访问说明符一样, 这是没错的,因为:
N3376(C ++ 11草案的第一篇文章)9.2 [class.mem] / 13:
分配具有相同访问控制的(非联合)类的非静态数据成员(第11条),以便后面的成员在类对象中具有更高的地址。具有不同访问控制的非静态数据成员的分配顺序是未指定的。实施对齐要求可能导致两个相邻成员不能立即分配;所以可能需要空间来管理虚函数(10.3)和虚基类(10.1)。
我仍然不明白这一点:
具有不同访问控制的非静态数据成员的分配顺序未经指定。
他们的意思是未指明,GCC当然有办法做到这一点,他们不只是随机做我猜...他们不希望用户知道它? 或者根据选项可能有很多种方式?
因为我尝试过的所有例子,我的命令与我文件中声明的顺序相同(+ padding)
我正在使用gcc 4.9.2,有人知道GCC是否指定了这样做的方式吗?
我需要知道这一点,因为我正在创建一个计算所有字段之间填充的程序,该程序适用于目前没有访问说明符的结构。当存在不同的可访问性块
时,我将不得不找到一种方法答案 0 :(得分:3)
未指定表示编译器为:
实现定义的方法,编译器可以自由做出任何决定,并且需要对其进行记录。。
如果您考虑此课程(略微修改您的版本):
class X {
private:
int b;
int z;
public:
char c;
int a;
private:
char e;
public:
int d;
};
那么规范中的文字意味着:
&c < &a
- 两者都属于同一个访问控制。&b < &z
- 两者都属于同一个访问控制。&z < &e
- 两者都属于相同的访问控制,具有交错功能。&a < &d
- 两者都属于相同的访问控制,具有交错功能。&z < &c
- 两者都属于不同的访问控制。&a < &e
- 两者都属于不同的访问控制。我见过为每个变量使用访问说明符的代码,因此编译器可以重新排列它们,以使大小尽可能小。