c语言中的自动对齐键,C语言结构体内存对齐规律自我总结

C语言结构体内存对齐规律自我总结-- 如果有其他学习者已有一定理解,但是对某些地方还是有些疑惑,或许可以看懂我所写---主要为了自己总结复习--如有错误方便再改

如果有其他学习者已有一定理解,但是对某些地方还是有些疑惑,或许可以看懂我所写—主要为了自己总结复习–如有错误方便再改)

前要知识:

CPU一次性能读取数据的二进制位数称为字长,一个字节=8位。

那么32位处理器可以一次性最大处理4个字节的数据量。

我们这里讨论的也是在32位计算机中,明白后可以按规律推广至64位计算机。

那么在结构体中就需要注意,

如果结构体类型中包含有某个结构体成员,它的类型所占字节数是等于4的,例如4字节的整型

那么必须保证cpu一次就能把这四个字节全部读取。即读取的时候在整型的起始地址的边界开始读取,就可以一次性确保读取4个字节成功。

设想如果,并不是在整型的边界读取数据的话, 那么它将会被分二次读取,才能读取完整这个整型所包含的所有数据。 这时候cpu还需额外的操作将分二次读取的数据整合在一起,降低了系统性能。

切入正题:(32位计算机中)

首先: 找到所在结构体所有成员当中----所占字节数最大的那个类型的成员.

例:如果最大类型成员是int(4字节) 的情况

那么需要保证永远可以在int内存起始地址边界位置读取数据

例:如果最大类型成员是int 的情况

struct temp

{

char a;

char b;

int c;

};

此为内存图示, [a][b][x][x][c][c][c][c] 共占8字节

[x]代表内存补位; 补位以达到,cpu读取时,可以通过一次读取, 读取一个整型的所有数据.

例:如果最大类型成员是short(2字节) 的情况

那么需要保证永远可以在short内存起始地址边界位置读取数据

struct temp

{

char a;

short b;

char c;

};

此为内存图示, [a][x][b][b][c][x] 共占6字节

对于结构体中最大成员类型所占是2个字节的short情况下

需注意, 对于32位计算机不是说我每次一定要读满4个字节, 是代表一次读取时可以小于等于4个字节数据. 但是不能超过4个字节的数据.

short 最大类型情况下, 那么以每次读取2个字节来判断结构体内存所占字节的标准, 也就是通过补位达到

cpu读取时,可以通过一次读取, 读取一个short的所有数据.

总结: 以结构体成员类型所占字节数最大的那个成员为判别标准, 使 cpu读取时,总是可以通过一次读取, 就读取一个该类型的所有数据.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值