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

`#pragma pack(1)的使用

#pragma pack(1)#pragma pack()是编译器指令,用于控制结构体(或联合体)成员在内存中的对齐方式。


对齐的基本概念

默认情况下,编译器为了提高访问效率,会对结构体成员进行对齐。例如,一个uint16_t类型的成员通常会被放置在 2 字节的整数倍地址上,如果前面有奇数个字节的u8成员,编译器会在中间插入填充字节(padding),保证对齐。这样结构体的大小可能大于成员大小之和。


#pragma pack(1)的作用

#pragma pack(1)强制编译器采用1 字节对齐,即取消所有填充,成员在内存中紧密排列,没有任何空隙。这会使结构体的大小等于成员大小的总和,但可能降低 CPU 访问效率(尤其是在某些架构上可能产生非对齐访问异常)。


#pragma pack()的作用

#pragma pack()恢复默认的对齐方式(通常由编译器设定,例如 4 字节或 8 字节对齐)。


在你问题中的影响

transform.h中,你使用了#pragma pack(1)来定义PHYSICALKEY结构体。但是RotaryDial结构体是在ADS1015.h中定义的,并且没有使用相同的对齐指令。这导致:

  • ADS1015.c编译时,RotaryDial采用默认对齐(例如 4 字节),value成员(uint16_t)的偏移量可能是 6(因为前面有 5 个u8,再加 1 字节填充)。
  • transform.c编译时,由于#pragma pack(1)的影响仍然存在(如果transform.h在包含ADS1015.h之前设置了 pack),RotaryDial结构体在transform.c中也会被强制 1 字节对齐,value的偏移量为 5。

两个文件对同一结构体的内存布局理解不同,导致transform.c访问RotaryDial_l.value时,实际读取的是结构体中偏移 5 处的数据,而那个位置可能是state或其他值,从而得到类似地址的大数。


解决方案

  1. 统一对齐方式:在ADS1015.h中的RotaryDial定义前 也加上#pragma pack(1),确保所有文件都使用相同的紧凑布局。
  2. 调整成员顺序:将对齐敏感的成员(如uint16_t value)放在结构体最前面,这样无论对齐方式如何,其偏移量始终为 0,避免错位。

推荐优先尝试方案 2,因为改动最小且不会影响其他代码。

http://www.jsqmd.com/news/572929/

相关文章:

  • Qwen3-14B效果展示:将技术需求文档自动转换为可执行测试用例
  • 万象视界灵坛实操手册:CLIP-ViT-L/14在专利附图技术特征提取中的探索
  • Windows系统入侵排查
  • 别再乱用GET传密码了!用FastAPI手把手教你构建安全的用户注册登录接口(附完整代码)
  • 很多PCIe问题查不出来,其实一开始方向就错了
  • CryptoJS不同加密模式对比:AES-CBC vs GCM在前端安全中的选择指南
  • 【无人机控制】非线性四旋翼无人机控制器实现附matlab代码
  • S2-Pro大模型Java后端集成指南:SpringBoot微服务实战
  • PyTorch 2.8镜像实战落地:教育机构AI教学平台(图文+视频+LLM)集成方案
  • 告别教材下载烦恼:国家中小学智慧教育平台电子课本解析工具如何实现3分钟高效获取
  • 3步搭建高效NTQQ机器人:LuckyLilliaBot全功能配置指南
  • 量子密钥分发B92协议:从理论到实践的简明指南
  • 小白入门”入侵检测”
  • 微信QQ防撤回神器:RevokeMsgPatcher 2.1 终极使用教程
  • 保姆级教程:在Gazebo里用UR5+RealSense D435i搞定手眼标定(附避坑代码)
  • Pspice仿真新手避坑大全:为什么你的TL431仿真总报错?可能是模型库没加对
  • 如何用大麦自动抢票工具提升抢票成功率?技术原理与实战指南
  • AI Token Platform - AI Token 中转计费平台
  • CherryStudio实战:如何用MCP协议给AI助手装上B站搜索插件?
  • 揭秘JVM创世过程之Call Stub进入Java世界的门票
  • 实测Qwen3.5推理模型:用它写代码、解逻辑题,效果到底有多强?
  • ubuntu秘钥生成PKCS1 格式秘钥
  • Gemma-3-270m多场景应用:律师合同风险点识别、条款合规性初筛案例
  • PyTorch 2.8镜像实操手册:/data盘挂载后权限配置与数据安全策略
  • 钢链数智,赋能实业——千匠网络钢铁产业电商系统,破解行业困局,激活钢铁增长新动能
  • Odoo 19成本核算避坑指南:标准成本法下差异分析、委外加工汇率风险与WIP分录丢失问题
  • 3步掌握百度网盘效率工具:全平台秒传链接解决方案
  • 如何用1000美元打造工业级六轴机械臂:Faze4开源项目的完整实践指南
  • 解锁3大智能功能:League-Toolkit让普通玩家也能玩转专业级游戏分析
  • 大模型文件的组成