考虑以下 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
为什么结构的大小不等于其各个组件变量大小的总和?
考虑以下 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
为什么结构的大小不等于其各个组件变量大小的总和?
编译器可能会为对齐要求添加填充。请注意,这不仅适用于结构字段之间的填充,还可能适用于结构的末尾(这样结构类型的数组将使每个元素正确对齐)。
例如:
struct foo_t {
int x;
char c;
};
即使该c字段不需要填充,该结构通常也会有一个sizeof(struct foo_t) == 8(在 32 位系统上——而不是具有 32 位int类型的系统),因为在字段之后需要有 3 个字节的填充c。
请注意,系统(如 x86 或 Cortex M3)可能不需要填充,但出于性能原因,编译器可能仍会添加它。
如前所述,C 编译器将为对齐要求添加填充。这些要求通常与内存子系统有关。某些类型的计算机只能访问排列为某个“不错”值的内存,例如 4 个字节。这通常与字长相同。因此,C 编译器可能会将结构中的字段与该值对齐,以使它们更易于访问(例如,4 字节值应该是 4 字节对齐)此外,它可能会填充结构的底部以对齐结构后面的数据. 我相信还有其他原因。更多信息可以在这个维基百科页面上找到。
您的默认对齐方式可能是 4 个字节。30 字节的元素得到 32,或者整个结构被四舍五入到下一个 4 字节间隔。
对齐到 6 个字节并不奇怪,因为它对齐到多个到 4 的地址。
所以基本上你的结构中有 34 个字节,下一个结构应该放在地址上,即 4 的倍数。34 之后最接近的值是 36。这个填充区域计入结构的大小。