结构体内存对齐

结构体内存对齐遵循的原则

  1. 结构体的第一个成员永远都放在0偏移处

  1. 第二个成员开始以后的每个成员都要对齐到他们对应对齐数的整数倍上 对齐数是默认对齐数和自身大小较小的数

  1. 成员全放入后整体大小是所有成员变量中的对齐数的最大对齐数的整数倍数

  1. 结构体嵌套 嵌套的结构体要对齐到嵌套结构体本身成员变量的最大对齐数上 整体大小是两个结构体最大对齐数的整数倍

如图:

char c1的大小是1字节 从0偏移量处开始放入占1个字节

int a是4字节 vs下的默认对齐数是8字节 所以对齐数是4字节 从4字节的整数倍处开始对齐 就是偏移量是4的地方开始存储 占4字节 到偏移量7的位置

char c2大小是1字节 默认对齐数是8 所以对齐数是1字节 从1字节的整数倍开始对齐 偏移量8的位置是1的整数倍 占一个字节 总大小是0偏移到8偏移 一共9字节 不是最大对齐数4的整数倍 所以浪费3字节到偏移量为11的位置 0~11一共12字节是最大对齐数4的整数倍 所以总大小就是12字节

如上图: 结构体嵌套结构体

求s4的大小

char c1从0偏移开始 占1字节

嵌套结构体类型是对齐到嵌套结构体自身的最大对齐数的整数倍处 struct s3的自身成员中最大对齐数是8 所以嵌套结构体要对齐到8的整数倍处 那么就从8偏移处开始对齐占16字节 到23偏移处

double d的本身大小是8 默认对齐数是8 对齐数是8 从8的倍数开始对齐 24偏移是8的整数倍 占8个字节到31偏移处 此时大小是32字节 32个字节是两个结构体中最大对齐数8的整数倍 所以总大小是32字节

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值