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 — 属于不同的访问控制。

我见过为每个变量使用访问说明符的代码,这样编译器就可以重新排列它们,从而使大小尽可能小。