69,371
社区成员
发帖
与我相关
我的任务
分享
struct tagA
{
char a; //第一个成员自身长为1,#pragma pack(4),取小值1,所以放在[0]位置上
short b; //第二个成员自身为2,,#pragma pack(4),取小值2,按2字节对齐,所以放在[2,3]位置上
char c; //第三个成员自身长为1,#pragma pack(4),取小值1,所以放在[4]位置上
};
//这个结构实际占据的内存空间是5字节的对齐;按照内部最大的成员的长度,和#pragma pack规定的值之中较小的一个对齐的。
所以结构之间对齐的长度是min(sizeof(short),4),也就是2。 5按照2字节圆整的结果是6,所以sizeof(struct tagA)是6。
/*
Win32平台下的微软C编译器(cl.exe for 80×86)的对齐策略:
1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
备注:编译器在给结构体开辟空间时,首先找到结构体中最宽的基本数据类型,然后寻找内存地址能被该基本数据类型所整除的位置,作为结构体的首地址。将这个最宽的基本数据类型的大小作为上面介绍的对齐模数。
2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);
备注:为结构体的一个成员开辟空间之前,编译器首先检查预开辟空间的首地址相对于结构体首地址的偏移是否是本成员的整数倍,若是,则存放本成员,反之,则在本成员和上一个成员之间填充一定的字节,以达到整数倍的要求,也就是将预开辟空间的首地址后移几个字节。
3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要,编译器会在最末一个成员之后加上填充字节(trailing padding)。
备注:结构体总大小是包括填充字节,最后一个成员满足上面两条以外,还必须满足第三条,否则就必须在最后填充几个字节以达到本条要求。
*/
struct tagA
{
char a; //1个字节,因为下一变量是short2个类型,so 要补齐1个字节
short b; //2个字节
char c; //1个自己
};
所以是5个字节,看这个,主要看最大数据类型,然后首字节要与最大数据类型字节进行对齐,因此余下的字节要进行补齐