gcc如何计算结构所需的空间?

R__*_*R__ 4 c gcc struct

struct {
   integer a;
   struct c b;
   ...
}
Run Code Online (Sandbox Code Playgroud)

一般来说,gcc如何计算所需的空间?这里有没有人偷看内幕?

R..*_*R.. 12

我没有"偷看内幕",但它很清楚,任何理智的编译器都会以完全相同的方式完成它.过程如下:

  1. 从0开始.
  2. 对于每个元素,圆形大小直到该元素的下一个对齐倍数,然后添加该元素的大小.
  3. 最后,圆形尺寸直到所有成员的最小公差倍数.

这是一个例子(假设int是4个字节并且有4个字节对齐):

struct foo {
    char a;
    int b;
    char c;
};
Run Code Online (Sandbox Code Playgroud)
  1. 大小最初为0.
  2. 圆对齐char(1); 大小仍为0.
  3. 添加char(1)的大小; 现在大小是1.
  4. 圆对齐int(4); 现在大小是4.
  5. 添加int(4)的大小; 现在大小是8.
  6. 圆对齐char(1); 大小仍然是8.
  7. 添加char(1)的大小; 现在大小是9.
  8. 圆到1厘米(1,4)(4); 现在大小是12.

编辑:为了解决为什么最后一步是必要的,假设大小只是9而不是12.现在声明struct foo myfoo[2];并考虑&myfoo[1].b,这是过去的myfoo9个字节和过去9个字节的13个字节&myfoo[0].b.这意味着它是不可能的两个myfoo[0].bmyfoo[1].b对齐到其所需的对准(4).