关于C++结构体sizeof计算与内存填充的疑问
C++结构体内存填充问题解答
你的理解不完全准确,实际的内存填充位置和数量和你想的不一样,下面结合你的代码详细分析:
你的结构体内存布局拆解
主流x86/x64平台下,int和float的大小为4字节,对齐要求为4字节;char大小为1字节,对齐要求为1字节。你的StudentRecord结构体内存布局如下:
firstName(char[9]):占用地址0-8,共9字节lastName(char[9]):占用地址9-17,共9字节,此时已用内存18字节- 填充2字节:下一个成员
id是int,要求起始地址是4的倍数,18不是4的整数倍(18%4=2),因此在lastName后填充2字节(地址18-19),将起始地址推到20 id(int):占用地址20-23,共4字节gpa(float):占用地址24-27,共4字节(24是4的倍数,符合对齐要求)currentHours(int):占用地址28-31,共4字节totalHours(int):占用地址32-35,共4字节
最终总大小为36字节,刚好是结构体最大对齐单位(4字节)的整数倍(36/4=9),无需额外末尾填充。
内存填充的具体过程
编译器会遵循内存对齐规则优化CPU的内存访问效率,具体步骤如下:
- 确定对齐要求:
- 基本数据类型的对齐要求通常等于自身大小(如char=1,int=4,double=8,不同平台可能有差异)
- 数组的对齐要求与元素类型一致
- 结构体的对齐要求是其所有成员中最大的对齐要求
- 逐个放置成员:
从结构体起始地址开始,依次为每个成员分配内存。如果当前可用地址不符合该成员的对齐要求,就插入填充字节,直到地址满足对齐条件。 - 调整总大小:
结构体的总大小必须是其对齐要求的整数倍,如果当前总大小不满足,就在结构体末尾添加填充字节。
内存填充的核心目的是提升CPU访问效率:CPU通常按固定字长(如4字节、8字节)读取内存,未对齐的数据需要CPU分两次读取并拼接,会降低性能;对齐后可以一次完成读取,效率更高。
内容的提问来源于stack exchange,提问作者sion
相关产品推荐
相关产品推荐

