C中结构的大小

size of struct in C

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Why isn’t sizeof for a struct equal to the sum of sizeof of each member?

考虑以下C代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#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 30

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


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

例如:

1
2
3
4
struct foo_t {
    int x;
    char c;
};

尽管c字段不需要填充,但结构通常具有sizeof(struct foo_t) == 8(在32位系统上,而不是32位int类型的系统上),因为c字段后面需要3个字节的填充。

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


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


您的默认对齐方式可能是4个字节。要么30字节的元素得到32,要么整个结构被四舍五入到下一个4字节的间隔。


对齐6个字节并不奇怪,因为它对齐的地址是4到4的倍数。

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