【C语言】如何计算结构体大小-----内存对齐(图文讲解)

本文详细解析了结构体内存对齐的规则及其原因,包括第一个成员的对齐数、其他成员的对齐规则、结构体总大小的计算以及嵌套结构体的对齐方式。并解释了内存对齐对硬件平台的兼容性和提高CPU读取效率的重要性。

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

计算结构体大小时,并不是单纯的将成员大小相加,而是要考虑结构体内存对齐规则。

结构体内存对齐规则:

1.第一个结构体成员,在结构体变量首地址偏移量为0的地址处(第一个成员不需要对其,但具有对齐数);
在这里插入图片描述
2。除第一个成员外,其他成员变量存储时都要对应到对齐数的整数倍的地址处;
对齐数=编译器默认对齐数与该成员大小中的较小值(vs默认值为8,Linux默认值为4)

通过代码探究其存储方式:

例1:
在这里插入图片描述
在这里插入图片描述
3.结构体总大小为最大对其数的整数倍;

4.若结构体中嵌套了结构体,嵌套结构体对齐到自己最大的整数倍处。
例2:
在这里插入图片描述

为什么要内存对齐

1.平台原因(移植原因)
不是所有的硬件平台都能访问任意地址上的数据;某些硬件平台只能只在某些地址访问某些特定类型的数据,否则抛出硬件异常。
2.性能原因
结构体中可以存放不同类型的数据,若不进行内存对齐就会形成下图所示的存储方式
在这里插入图片描述
CPU在读取内存时是一块一块读取的,如上图所示,若CPU想要获取int i的数据,假设cpu一次读取的内存为4字节,就需要进行两次内存访问
在这里插入图片描述
而内存对齐的内存访问只需要一次访问
总的来说,内存对齐是一种以空间换时间的做法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值