C中结构的大小

时间:2009-12-03 18:22:43

标签: c struct structure-packing

  

可能重复:
  Why isn’t sizeof for a struct equal to the sum of sizeof of each member?

考虑以下C代码:

#include <stdio.h>    

struct employee
{
  int id;
  char name[30];  
};

int main()
{
  struct employee e1;      
  printf("%d %d %d", sizeof(e1.id), sizeof(e1.name), sizeof(e1));
  return(0);
}

输出结果为:

4 30 36

为什么结构的大小不等于其各个组件变量的大小总和?

4 个答案:

答案 0 :(得分:58)

编译器可能会为对齐要求添加填充。请注意,这不仅适用于结构字段之间的填充,还可以应用于结构的末尾(以便结构类型的数组将使每个元素正确对齐)。

例如:

struct foo_t {
    int x;
    char c;
};

即使c字段不需要填充,结构通常也会有sizeof(struct foo_t) == 8(在32位系统上 - 而不是具有32位int的系统type)因为c字段后需要3个字节的填充。

请注意,系统可能不需要填充(如x86或Cortex M3),但出于性能原因,编译器可能仍会添加填充。

答案 1 :(得分:3)

如前所述,C编译器将为对齐要求添加填充。这些要求通常与内存子系统有关。某些类型的计算机只能访问内存为“好”值的内存,如4个字节。这通常与单词长度相同。因此,C编译器可以将结构中的字段与此值对齐,以使它们更容易访问(例如,4字节值应该是4字节对齐)此外,它可以填充结构的底部以排列结构后面的数据。我相信还有其他原因。更多信息可以在this维基百科页面找到。

答案 2 :(得分:2)

您的默认对齐可能是4个字节。 30字节元素得到32,或整个结构向上舍入到下一个4字节间隔。

答案 3 :(得分:1)

对齐6个字节并不奇怪,因为它正在对齐多个到4个地址。

所以基本上你的结构中有34个字节,下一个结构应该放在地址上,即4的倍数.34之后的最接近的值是36.而且这个填充区域计入结构的大小。 / p>