news 2026/4/27 5:08:59

结构体大小计算(pack)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
结构体大小计算(pack)

结构体大小计算(pack)

最终大小=成员放置完后的偏移量,向上补齐到min(最大成员自然对齐,pack)的整数倍。

1.确定两值:

成员对齐值:控制这个成员自己应该放在哪个偏移位置(比如double不能放在地址不能被8整除的位置)。 整体对齐值:控制整个结构体的大小应该是多少的倍数(方便用数组存放时,每个结构体元素都能自然对齐)。

每个成员的对齐值 = min(自身自然对齐, pack):
整体对齐值 = min(最大自然对齐8, pack=4) = 4

例子:

#pragmapack(4)structOne{doubled;//每个成员的对齐值=min(8,4)=4/* 从0开始,然后占八字节,下一个开始的地址为8 */charc;//每个成员的对齐值=min(1,4)=1/* 从8开始,然后占1字节,下一个开始的地址为9 */inti;//每个成员的对齐值=min(4,4)=4/* 9不是成员的对齐值4的整数倍,所以 从12开始,然后占4字节,下一个开始的地址为16 */}//整体对齐值 = min(最大自然对齐8, pack=4) = 4//最终的16是4的整数倍,那么就得到最后的值为16
根本判决方法: 确定每个成员对齐值,那么就是确定他们的 起始位置 必须为 成员对齐值的整数倍。 整体对齐值,就是最终当你得出大小的时候,要看是不是整体对齐值的整数倍。

2.示例:

2.1 混合类型:

structA{chara;// 1/* PACK(4):每个成员的对齐值=min(1,4)=1 从0开始,偏移1字节,下一个从1开始 */---------------------------------/* PACK(8):每个成员的对齐值=min(1,8)=1 从0开始,偏移1字节,下一个从1开始 */intb;// 4/* PACK(4):每个成员的对齐值=min(4,4)=4 从1开始不是四的整数倍 从4开始,偏移4字节,下一个从8开始 */--------------------------------/* PACK(8):每个成员的对齐值=min(4,8)=4 从1开始不是4的整数倍 从4开始,偏移4字节,下一个从8开始 */shortc;// 2/* PACK(4):每个成员的对齐值=min(2,4)=2 从8开始,偏移2字节,下一个从10开始 */---------------------------------/* PACK(8):每个成员的对齐值=min(2,8)=2 从8开始,偏移2字节,下一个从10开始 */};//整体对齐值 = min(最大自然对齐4, pack=4) = 4//最终的10不是4的整数倍,那么就得到最后的值为12-----------------------------------------//整体对齐值 = min(最大自然对齐4, pack=10) = 4//最终的10不是4的整数倍,那么就得到最后的值为12

2.2包含double

structB{chara;// 1/* PACK(4):每个成员的对齐值=min(1,4)=1 从0开始,偏移1字节,下一个从1开始 */---------------------------------/* PACK(8):每个成员的对齐值=min(1,8)=1 从0开始,偏移1字节,下一个从1开始 */doubleb;// 8/* PACK(4):每个成员的对齐值=min(8,4)=4 从1开始不是4的整数倍 从4开始,偏移8字节,下一个从12开始 */---------------------------------/* PACK(8):每个成员的对齐值=min(8,8)=8 从1开始不是8的整数倍 从8开始,偏移8字节,下一个从16开始 */intc;// 4/* PACK(4):每个成员的对齐值=min(4,4)=4 从12开始,偏移4字节,下一个从16开始 */---------------------------------/* PACK(8):每个成员的对齐值=min(4,8)=4 从16开始,偏移4字节,下一个从20开始 */};//整体对齐值 = min(最大自然对齐8, pack=4) = 4//最终的16是4的整数倍,那么就得到最后的值为16-----------------------------------------//整体对齐值 = min(最大自然对齐8, pack=8) = 8//最终的20不是8的整数倍,那么就得到最后的值为24

2.3.结构体成员的自然对齐都小于 pack

structC{chara;// 1shortb;// 2charc;// 1};pack(4----->6pack(8----->6

2.4数组和嵌套结构体

structD{chararr[3];// 3个char,自然对齐1intx;// 4shorty;// 2};pack(4----->12pack(8----->12
最后两个用来自我检测
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/27 5:07:20

Qwen3-Reranker-0.6B入门实战:从零搭建本地检索增强系统

Qwen3-Reranker-0.6B入门实战:从零搭建本地检索增强系统 1. 导语:为什么你需要一个本地重排序器? 想象一下这个场景:你为公司搭建了一个智能知识库,员工输入问题后,系统能快速从海量文档中找到相关段落。…

作者头像 李华
网站建设 2026/4/27 5:07:19

LFM2.5-1.2B-Instruct应用指南:如何定制你的垂直场景AI助手?

LFM2.5-1.2B-Instruct应用指南:如何定制你的垂直场景AI助手? 1. 为什么选择LFM2.5-1.2B-Instruct? 在边缘设备和低资源服务器上部署AI助手一直是个挑战。大多数大语言模型需要昂贵的GPU和大量内存,而LFM2.5-1.2B-Instruct正是为…

作者头像 李华
网站建设 2026/4/27 5:02:46

Java:反射

一、反射的核心概念1. 什么是反射?反射的本质是在程序运行时,获取并操作类的所有信息的能力。类的信息包括:成员变量、方法、构造函数、父类、接口、修饰符等。反射打破了编译期的访问限制,能直接操作private/protected修饰的成员…

作者头像 李华
网站建设 2026/4/27 4:58:28

VCG 网格整形(Smoothed ARAP)

文章目录 一、简介 二、实现代码 三、实现效果 参考资料 一、简介 虽然 ARAP算法在许多情况下都能够产生良好的结果,但它也有一些局限性,例如在处理大幅度形状变化或复杂边界条件下可能效果不佳。因此就有一些学者尝试添加平滑项,抑制变形过程中出现的不自然形状,公式如下所…

作者头像 李华
网站建设 2026/4/27 4:53:49

EasyAnimateV5图生视频部署:Nginx反向代理配置支持HTTPS与域名访问

EasyAnimateV5图生视频部署:Nginx反向代理配置支持HTTPS与域名访问 你是不是已经成功部署了EasyAnimateV5图生视频模型,但还在用IP地址加端口号的方式访问服务?每次都要输入一长串的http://183.93.148.87:7860,不仅难记&#xff…

作者头像 李华