public 和私有字段的内存分配 - GCC 方式
Memory allocation for public and private fields - GCC way
这不是这个的副本 question,
我看了答案,但我对这个问题还有一些疑问。
我测试了一些 类 像这样:
class A {
private:
int b;
public:
char c;
int a;
private:
char e;
};
而且我看到字段的存储方式就好像没有访问说明符一样,
这没有错,因为 :
N3376(第一个 post C++11 草案)9.2 [class.mem]/13:
Nonstatic data members of a (non-union) class with the same access control (Clause 11) are allocated so that later members have higher addresses within a class object. The order of allocation of non-static data members with different access control is unspecified. Implementation alignment requirements might cause two adjacent members not to be allocated immediately after each other; so might requirements for space for managing virtual functions (10.3) and virtual base classes (10.1).
我还不明白的是:
The order of allocation of non-static data members with different access control is unspecified.
他们所说的未指定是什么意思,GCC 当然有办法做到这一点,我猜他们不只是随机地做...他们不想让用户知道吗?
或者根据选项可能有很多方法?
因为我尝试了所有示例,所以我的顺序与文件中声明的顺序相同(+ 填充)
我正在使用 gcc 4.9.2,有谁知道 GCC 是否指定了他们这样做的方式?
我需要知道这一点,因为我正在创建一个程序来计算所有字段之间的填充,该程序目前使用没有访问说明符的结构。当存在不同的可访问性块时,我将不得不找到一种方法来做到这一点
未指定表示编译器是:
- 随心所欲地做出任何决定
- 不需要记录它。
实现定义意味着,编译器可以自由做出任何决定,并且需要记录下来。。
如果你考虑这个class (稍微修改你的版本):
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
— 属于不同的访问控制。
我见过为每个变量使用访问说明符的代码,这样编译器就可以重新排列它们,从而使大小尽可能小。
这不是这个的副本 question, 我看了答案,但我对这个问题还有一些疑问。
我测试了一些 类 像这样:
class A {
private:
int b;
public:
char c;
int a;
private:
char e;
};
而且我看到字段的存储方式就好像没有访问说明符一样, 这没有错,因为 :
N3376(第一个 post C++11 草案)9.2 [class.mem]/13:
Nonstatic data members of a (non-union) class with the same access control (Clause 11) are allocated so that later members have higher addresses within a class object. The order of allocation of non-static data members with different access control is unspecified. Implementation alignment requirements might cause two adjacent members not to be allocated immediately after each other; so might requirements for space for managing virtual functions (10.3) and virtual base classes (10.1).
我还不明白的是:
The order of allocation of non-static data members with different access control is unspecified.
他们所说的未指定是什么意思,GCC 当然有办法做到这一点,我猜他们不只是随机地做...他们不想让用户知道吗? 或者根据选项可能有很多方法?
因为我尝试了所有示例,所以我的顺序与文件中声明的顺序相同(+ 填充)
我正在使用 gcc 4.9.2,有谁知道 GCC 是否指定了他们这样做的方式?
我需要知道这一点,因为我正在创建一个程序来计算所有字段之间的填充,该程序目前使用没有访问说明符的结构。当存在不同的可访问性块时,我将不得不找到一种方法来做到这一点
未指定表示编译器是:
- 随心所欲地做出任何决定
- 不需要记录它。
实现定义意味着,编译器可以自由做出任何决定,并且需要记录下来。。
如果你考虑这个class (稍微修改你的版本):
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
— 属于不同的访问控制。
我见过为每个变量使用访问说明符的代码,这样编译器就可以重新排列它们,从而使大小尽可能小。