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