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

时间:2015-04-24 08:06:57

标签: c++ c++11 gcc g++ memory-alignment

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

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

时,我将不得不找到一种方法

1 个答案:

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

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