A004-数据对齐的原因

本文探讨了数据对齐的原因,以32位机器为例,解释了数据对齐如何影响CPU读取效率,如果不对齐,可能导致CPU读取错误,甚至引发硬件中断。对齐规则包括基本数据类型的对齐模数以及结构体和位域的对齐策略。通过实例解析了结构体内存布局和位域的存储方式,并介绍了#pragma pack(n)指令用于自定义对齐方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天读到一篇数据对齐的文章,明白了为什么需要数据对齐(地址对齐)。
不过作者的语言是属于作者自己的,我并不能立即理解他的全部表达。
只有我自己去思考推导之后才明白他的一些表达,因此我有必要将自己对这篇文章的解读记录下来。
原文:http://blog.youkuaiyun.com/tigerscorpio/article/details/5933807
.

地址对齐

数据对齐:数据A的存储地址的地址值 必须能整出 数据A数据长度
例如:
2Byte 的数据、就应该被存放在地址值2的倍数内存上。
4Byte的数据、就应该被存放在地址值4的倍数内存上。
所以,我们通常说 1字节的数据无论如何都是对齐的,2字节的数据需要2字节对齐4字节的数据需要4字节对齐
.

对齐的原因

(以32位机器为例、不考虑大小端)
数据需要对齐,是因为计算机在设计时,将32bit的数据分成4个1字节的数据,分别存放在4个内存芯片上,4个内存芯片共同构成一块最终的芯片
4个芯片共用一条地址总线,每个内存单元地址如下:
这里写图片描述
假如有数据A = 0x12345678,存放的地址0x00,是4字节对齐的。
那么这个4个字节会分别被存放在4块芯片Offset=0处:

0x12345678
0x12存放在Chip-0的Offset=0(地址0)
0x34存放在Chip-1的Offset=0(地址1)
0x56存放在Chip-2的Offset=0(地址2)
0x78存放在Chip-3的Offset=0(地址3)

CPU读取数据A时,会向地址总线发出 addr = 0x00地址值,由于4块芯片共用地址总线,所以4块芯片收到的地址值都是0x00,结果是都寻址4块芯片Offset=0处,一次寻址就读出32bit数据A
.
假如数据A 不是4字节对齐 存放 的,比如存放的地址0x01
那么这4个字节会分别被存放在4块芯片的如下位置:

0x12345678
0x12存放在Chip-1的Offset&#
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值