1、占位符
当结构体内容为空时,仍然会有一个字节的大小,如下:
int main()
{
//占位符
typedef struct
{}A;
A a;
printf("%d\n",sizeof(a));
return 0;
}
2、对齐
- 将结构体中占字节最多的类型的字节数作为对齐数
- 结构体成员申请内存时,每一次分配对齐数大小的字节,当不够的时候才进行下一次分配
- 结构体按顺序分配内存
- 结构体大小是对齐数的整数倍
分析如下代码
typedef struct
{
int a;
char b;
short c;
}B;
B b;
printf("%d\n",sizeof(b));
结构体B中,int占字节数最大,因此将int所占的字节数4作为对齐数
首先,为a申请内存,一次分配4个大小的内存,a刚好用完
然后,为b申请内存,上一次分配的内存已经用完,因此继续分配4个大小内存,b使用一个,还剩三个
最后,为c申请内存,上一次分配的内存还剩三个,c只需要两个,因此不用继续申请,使用上次剩下的,分配完还剩一个
所以,共分配了两次,每次分配4个大小内存,结构体B占8个大小内存
分析如下代码
typedef struct
{
char a;
short b;
short c;
char* d;
}C;
C c;
printf("%d\n",sizeof(c));
结构体C中 char* 类型占字节数最多,因此将4作为对齐数
首先,为a申请内存,分配4个大小内存,a使用1个,还剩3个
然后,为b申请内训,b需要2个,还剩3个,够用,不需要重新分配,b使用完还剩1个
继续,为c申请内存,c需要2个,只剩下一个,不够用,因此重新分配4个,c使用2个,还剩2个
最后,为d申请内存,d需要4个,只剩下2个,不够用,因此重新分配4个,d使用4个,剩下0个
所以共分配了三次,每次分配4个,结构体C占12个大小内存.