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; }; |
尽管
请注意,系统可能不需要填充(如x86或Cortex M3),但出于性能原因,编译器仍可能添加填充。
如前所述,C编译器将为对齐要求添加填充。这些需求通常与内存子系统有关。有些类型的计算机只能访问一些"不错"值的内存,比如4字节。这通常与单词长度相同。因此,C编译器可以将结构中的字段与该值对齐,以使它们更容易访问(例如,4个字节的值应与4个字节对齐),此外,它还可以填充结构的底部,以排列结构后面的数据。我相信还有其他原因。更多信息可以在这个维基百科页面找到。
您的默认对齐方式可能是4个字节。要么30字节的元素得到32,要么整个结构被四舍五入到下一个4字节的间隔。
对齐6个字节并不奇怪,因为它对齐的地址是4到4的倍数。
所以基本上,您的结构中有34个字节,下一个结构应该放在地址上,这是4的倍数。34之后的最接近值是36。这个填充区域计入结构的大小。