第一步:确认对齐字节
第二步:填充内存字节,别处看到的一句话:如果一行中剩下的空间不足以填充某成员变量,则该成员变量在分配内存时会另起一行分配。 这里一行的空间就是对齐字节数
两种方式修改编译器默认对齐字节数:
1)如下
#pragma pack (16)
struct st_s{
char a;
int b;
};
#pragma pack ()
修改值a = 16;
默认值b = 结构体中占内存最大的字节长度,这里就是int类型的长度,就是4;
那么实际对齐值就是min(a, b),就是4,
所以结果sizeof(struct st_s) = 8;
2)
struct st_s{
char a;
int b;
};
__attribute((aligned (16)));
修改值a = 16;
默认值b = 结构体中占内存最大的字节长度,这里就是int类型的长度,就是4;
和1)不同的是,这个时候的对齐值就不是最小值了,而是按照修改值;
所以实际对齐值就是16,按照第二步说的,如果一行中剩下的空间不足以填充某成员变量,则该成员变量在分配内存时会另起一行分配,在这个例子中,char a占4字节,b紧跟其后占4字节,不用换新行,一行就可以填充两个成员的内存;
所以结果sizeof(struct st_s) = 16;