64位系统下两种结构体布局的内存填充机制疑问
64位系统下结构体内存填充与对齐解析
首先明确本次场景的基础参数:64位系统,char占1字节、float占4字节、long占8字节;编译器默认对齐规则为:
- 结构体的对齐边界等于成员中最大基本数据类型的大小(此处为
long的8字节) - 每个成员的起始地址必须是自身大小的整数倍
- 结构体总大小必须是对齐边界的整数倍,不足则在末尾填充
第一个结构体(总大小64字节)
结构体定义:
struct record{ char name[50]; float cost; long num; }stu;
内存布局拆解:
char name[50]:占用0~49地址,共50字节- 填充2字节:
float要求起始地址是4的整数倍,49的下一个4的倍数是52,因此在50~51地址填充2字节 float cost:占用52~55地址,共4字节long num:float结束于55,下一个8的倍数是56,正好满足long的8字节对齐要求,占用56~63地址,共8字节- 总大小:50+2+4+8=64字节,恰好是8的倍数,无需额外末尾填充
第二个结构体(总大小72字节)
结构体定义:
struct record{ char name[50]; long num; float cost; }stu;
内存布局拆解:
char name[50]:占用0~49地址,共50字节- 填充6字节:
long要求起始地址是8的整数倍,49的下一个8的倍数是56,因此在50~55地址填充6字节 long num:占用56~63地址,共8字节float cost:起始地址64是4的整数倍,满足对齐要求,占用64~67地址,共4字节- 填充5字节:当前总大小为50+6+8+4=68字节,需对齐到8的倍数,因此在68~71地址填充5字节,最终总大小为72字节
关键结论
结构体成员的排列顺序直接影响内存填充的字节数。将对齐要求相同或相近的成员放在一起,能有效减少填充字节,优化内存利用率。
内容的提问来源于stack exchange,提问作者Paulson Raja L
相关产品推荐
相关产品推荐

