公共和私人领域的内存分配 - GCC方式

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是否指定了这样做的方式?

我需要知道这一点,因为我正在创建一个程序来计算所有字段之间的填充,该程序适用于目前没有访问说明符的结构.当有不同的可访问性块时,我将不得不找到一种方法

Naw*_*waz 3

通过未指定的方式,编译器是:

  • 可以自由地做出任何决定
  • 并且不需要记录它。

实现定义意味着编译器可以自由做出任何决定,并且需要记录它。


如果您考虑此类(稍微修改您的版本)

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

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