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=0(地址1)
0x34存放在Chip-2的Offset=0(地址2)
7-5 顺序7-4 顺序表StuGrd_SqList(获取输入) 分数 30 作者 郑磊 单位 包头师范学院 建立顺序表StuGrd_SqList用来存放学生成绩信息,成绩信息格式如下: image.png 编写获取输入函数void InputList(StuGrd_SqList *L, int n); 在主函数中调用该InputList函数可以实现从键盘获取数据输入。 编写打印输出函数void OutputList(StuGrd_SqList L); 在主函数中调用该OutputList函数可以实现将顺序表L遍历输出。 输入格式: 从键盘获取用户输入,需要用户指定输入数据结点数量n,之后按照顺序分别输入每个结点的学号、姓名、数学成绩、语文成绩、物理成绩,总成绩应该通过计算获得。 每个输入之间使用空格、回车或者tab分隔。 输出格式: 第一行输出表头,学号、姓名、数学成绩、语文成绩、物理成绩、总成绩。 之后将表变量初值按照学号、姓名、数学成绩、语文成绩、物理成绩、总成绩的顺序输出。 输出字段之间用空格控制格式,注意空格数量。 输入样例: 在这里给出一组输入。例如: 4 A001 张一 90 85 95 A002 王二 80 85 90 A003 李三 95 91 99 A004 赵四 70 84 86 输出样例: 在这里给出相应的输出。例如: 学号 姓名 数学 语文 物理 总成绩 A001 张一 90 85 95 270 A002 王二 80 85 90 255 A003 李三 95 91 99 285 A004 赵四 70 84 86 240 代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB 栈限制 8192 KB C (gcc) 1 无提交记录 表StuGrd_SqList(插入结点)
最新发布
03-30
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值