如何计算结构体所占内存大小

本文详细介绍了在Win32平台下使用VC编译器时,如何通过字节对齐来确定结构体的大小。文章分两步解析了这一过程:首先计算‘有效对齐值’,然后根据该值分配内存并填充多余部分。

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

#以下所述是按照Win32平台下VC编译器中的规则来判断

 

要求结构体的大小需要我们理解编译器的是如何布局对象的内存结构,也就是如何进行字节对齐。

我把字节对齐的分为两步:

1. 求“有效对齐值”

a). 先求成员中“最大对齐值”,即成员中最大成员的大小,如果成员中含有结构体A,则是A中最大成员的大小。

b). 求“指定对齐值”,编译器默认为8,可以通过#pragma pack (value)指定

有效对齐值 = 最大对齐值与 指定对齐值之中的较小值。

 

2.  各成员应按照“有效对齐值”与自身大小进行内存分配。

从第一个成员开始

a) 先分配一个“有效对齐值”大小的内存空间,存放第一个成员,如果空间不够,则扩大空间,但扩大后必须是“有效对齐值”的整数倍;如果足够存放,看能不能容纳下一个成员,如果能就存放下一个成员,如果不能则再分配一个“有效对齐值”内存空间,前面的内存空间有多余没有利用的填充(padding)起来。

b) 后面每一个成员重复步骤a)

c) 最后一个成员如果比较小,不能满足 整个结构体的大小%有效对齐值 = 0,那么填充空余的部分,使其整个结构体的大小%有效对齐值 = 0。

 

网上有很多类似的计算,原理都差不多,这个是我自己理解的,感觉还是比较易懂,

按照这种方法试过很多结构体的计算,准确率100%。

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值