c# 结构体 4字节对齐_C/C++结构体内存对齐

在面试或工作中,经常会遇到内存对齐的问题。这里结合我的理解谈一谈对内存对齐的理解。

1. 为什么要内存对齐,不对齐会怎么样?

内存中存放数据是为了给CPU使用,CPU访问内存数据时会受到地址总线宽度的限制,也就是一次能从内存中拿多少数据到CPU(这里我们忽略CPU高速缓存)。而且,CPU从内存中获取数据时起始地址必须是地址总线宽度的倍数(我们用的intel CPU能处理不对齐的情况,某些CPU不能处理,即遇到不对齐程序会崩溃...)。

例如:CPU地址总线是64位(bit,8字节),当一个int(4字节)存储到地址: 0x06 时,CPU如何获取这个int值?

第一步:读取0x00~0x08 8个字节,然后保存后两个字节到 int 的前两个字节。

第二步:读取0x08~0x0F 8个字节,然后保存前两个字节到int的后两个字节。

6e7bb169a2e59125530ca80b825004b7.png
图1-内存访问

上面的例子可以看到,从内存中读取一个int到CPU中需要从内存中读取两次。这样大大降低了执行的效率,如何提升性能? 答案就是内存对齐!

2. 内存对齐的单位是什么?

通过上面的分析,知道内存对齐的目的是为了让CPU能一次获取到数据,从而提升性能。学过汇编会了解,CPU只能使用基本类型,char, short, int, long, float, double 等,不能使用数组或结构体等复合类型(汇编中并没有一个指令能直接存取一个struct或数组)。所以:内存对齐的单位是基本类型,目标是让CPU能一次获取到基本类型的值。

3. 如何进行内存对齐?

通过上面的介绍,我们可以得出:

a. 内存对齐是指,变量地址的对齐,而不是变量大小的对齐。变量地址的对齐是指变量地址 对 变量大小求模为0。

b. 结构体中每一个成员都要求是内存对齐的。

c. 结构体中的数组,按数组的类型对齐。

4. 如何计算内存对齐

分析内存对齐,只需要记住上一个小节中:变量地址的对齐是指变量地址 对 变量大小求模为0。数组以数组本身的类型来计算,例如:char c[5] 按 char 类型大小计算对齐,double d[22] 按 double 类型大小计算对齐。

320be52f2050036ba2d8e395d7933d7f.png
图2-示例程序

697d07ce994e0c3a65d81968dfa28ff9.png
图3-运行结果

通过这个示例,仔细想想,内存对齐就很简单了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值