当前位置: 首页 > news >正文

结构体大小计算(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
最后两个用来自我检测
http://www.jsqmd.com/news/706880/

相关文章:

  • 四十岁之后,真正决定人生高度的,从来不是能力
  • 深度学习批次大小选择与训练稳定性优化指南
  • 2026诚信成都透光混凝土厂家推荐:GRG吊顶/GRG造型/会议厅会议室GRG/剧院剧场GRG/发光混凝土/商场GRG/选择指南 - 优质品牌商家
  • Java:反射
  • hyperf 微服务架构方案大全
  • Linearis:现代高性能线性代数库的设计原理与异构计算实践
  • ImageNet挑战赛:计算机视觉深度学习的革命性转折
  • nli-MiniLM2-L6-H768作品分享:金融舆情报告中‘风险提示’与‘事件描述’中立性分析
  • AI代理技能库:模块化设计、核心技能与实战应用
  • 助贷CRM系统比较是什么?其主要特点应关注哪些方面?
  • 用 Python 批量制造表情包,从此聊天斗图没输过
  • AI模型部署效率提升210%,Docker AI Toolkit 2026到底重构了哪4层编排协议?
  • 阿里云国际站服务器DNS服务器设置成什么?服务器dns怎么填写?
  • 基于Qwen3.5-2B的智能日志聚合分析:从海量运维日志中快速定位问题
  • EasyAnimateV5图生视频部署:Nginx反向代理配置支持HTTPS与域名访问
  • Nixtla时间序列预测生态:统一接口、高速统计与深度学习模型实战
  • Phi-3.5-Mini-Instruct部署案例:高校AI教学实验平台轻量化部署方案
  • 成都地区、H型钢、400X200X8X13、Q235B、安泰、现货批发供应 - 四川盛世钢联营销中心
  • sklearn多核机器学习性能优化实战指南
  • C/C++:类型转换
  • 3步掌握ChanlunX缠论插件:通达信技术分析终极指南
  • 京东大屏AI手机+东东APP:银发智能,诚意够!
  • 成都地区、H型钢、350X350X12X19、Q235B、安泰、现货批发供应 - 四川盛世钢联营销中心
  • Ubuntu——常见基本命令
  • 2026绵阳玄关柜定制优质公司TOP5推荐:绵阳轻奢全屋定制/绵阳酒柜定制/绵阳阳台柜定制/绵阳高端家居定制/绵阳书房定制/选择指南 - 优质品牌商家
  • 教程太碎总失败?这篇Claude Code配置文:从Node.js到API调用一篇搞定(亲测跑通)(Windows系统)
  • 神经形态视觉传感器与3D堆叠计算架构解析
  • Vulkan GPU图像处理之幂律(伽马)变换:Kompute框架实战与性能分析
  • scikit-learn预测建模全流程解析与实战技巧
  • Docker技术入门与实战【2.6】