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

C语言结构体内存对齐使用场景

#pragma pack(push, 1) 和 #pragma pack(pop) 的使用场景(C语言)

这两个预处理指令用于控制结构体成员的内存对齐方式,主要在以下场景中使用:

主要使用场景

  1. 网络通信协议处理

    • 当需要精确控制结构体布局以匹配网络协议格式时

    • 确保结构体与协议定义的二进制格式完全一致

  2. 文件格式处理

    • 读写特定二进制文件格式(如图像、音频文件头等)

    • 确保结构体与文件中的二进制布局完全匹配

  3. 硬件寄存器映射

    • 当需要将结构体映射到特定的硬件寄存器布局时

    • 嵌入式系统中常见

  4. 与外部系统的数据交换

    • 与其他语言或系统进行二进制数据交换时

典型用法

#pragma pack(push, 1)  // 保存当前对齐方式,并设置为1字节对齐typedef struct {char id[4];int width;int height;short colorDepth;
} ImageHeader;  // 这个结构体将紧密排列,无填充字节#pragma pack(pop)  // 恢复之前的对齐设置

/*当前电流*/
#pragma pack(push, 1)
typedef struct _18E8EFF3_Frame{uint32_t                battery_calendar_life;          		    //电池日历寿命 			  精度1   单位Suint16_t                continuous_charging_current_allowed;        //BMS当前允许持续充电电流  精度0.1 单位Auint16_t                Continuous_discharge_current_allowed;       //BMS当前允许持续放电电流  精度0.1 单位A
}_18E8EFF3_Frame;
#pragma pack(pop)

/*电芯电压*/
#pragma pack(push, 1)
typedef struct _18E5EFF3_Frame{uint16_t                max_cell_volt;                              //最大电池电压 factor 0.001,offset 0   uint16_t                min_cell_volt;                              //最小电池电压 factor 0.001,offset 0uint16_t                ave_cell_volt;                              //平均电池电压 factor 0.001,offset 0uint8_t                 max_cell_volt_pos;                          //最大电池电压位置 factor 1,offset 0uint8_t                 min_cell_volt_pos;                          //最小电池电压位置 factor 1,offset 0
}_18E5EFF3_Frame;
#pragma pack(pop)

/*电压电流*/
#pragma pack(push, 1)
typedef struct _18E3EFF3_Frame{uint16_t                num_of_charge_cycles;                       //电池充电循环次数 factor 1uint8_t                 pack_soc;                                   //soc factor 0.5uint8_t                 pack_soh;                                   //soh factor 0.5int16_t                 pack_total_cur;                             //总电流 factor 0.1 A  电池包总电流(充电为负值,放电为正值)uint16_t                pack_total_vol;                             //总电压 factor 0.1 V  电池包电压            
}_18E3EFF3_Frame;
#pragma pack(pop)

为什么需要

  • 默认对齐:编译器通常会按成员大小对齐(如int按4字节边界)

  • 填充字节:编译器可能插入填充字节以实现对齐

  • 跨平台一致性:确保在不同平台上有相同的布局

注意事项

  1. 过度使用可能影响性能(未对齐访问在某些架构上较慢)

  2. 某些架构可能不支持非对齐访问(会导致硬件异常)

  3. 只应用于确实需要精确布局的结构体

  4. 确保push和pop成对出现,避免影响其他代码

这种技术虽然强大,但应谨慎使用,通常只在特定需求下才需要。

http://www.xdnf.cn/news/4215.html

相关文章:

  • 飞牛云如何开启及使用ssh:小白用户上手指南-家庭云计算专家
  • Laravel 12 基于 EMQX 实现 MQTT 消息发送与接收
  • 电商数据接口开发进阶:京东 API 实时商品信息采集技术解析​
  • 通过 ModernBERT 实现零样本分类的性能提升
  • Nginx 安全防护与HTTPS部署
  • Super VLAN配置
  • Ubuntu 系统中解决 Firefox 中文显示乱码的完整指南
  • 荣耀A8互动娱乐组件部署实录(第3部分:控制端结构与房间通信协议)
  • 机器学习例题——预测facebook签到位置(K近邻算法)和葡萄酒质量预测(线性回归)
  • 数字传播生态中开源链动模式与智能技术协同驱动的品牌认知重构研究——基于“开源链动2+1模式+AI智能名片+S2B2C商城小程序”的场景化传播实践
  • IdeaVim配置指南
  • 【Linux】Linux中的调度和切换
  • 开源智能体MetaGPT记忆模块解读
  • 【大数据】服务器上部署Apache Paimon
  • 基于k8s的Jenkins CI/CD平台部署实践(三):集成ArgoCD实现持续部署
  • 高铁座位指示灯系统技术深度解析:从物联网到智慧出行的实践路径
  • idea使用lombok错误,找不到符号,明明编译没问题,运行报错
  • The 2023 ICPC Asia Taoyuan Regional Programming Contest
  • 13.Spring boot中使用Actuator 监控
  • 深入了解linux系统—— 进程地址空间
  • CVE-2025-24813:Apache Tomcat RCE 漏洞分析
  • 拟南芥T2T基因组-文献精读127
  • Github上如何准确地搜索开源项目
  • 高等数学第四章---不定积分(4.4有理函数的不定积分2)
  • Elasticsearch:我们如何在全球范围内实现支付基础设施的现代化?
  • 甲骨文云服务器技术全景解析:从基础架构到行业赋能​
  • 从0开始学习大模型--Day2--大模型的工作流程以及初始Agent
  • NLP 和大模型技术路线
  • 51单片机同一个timer 作为定时器和波特率发生器么?
  • AutoDL+SSH在vscode中远程使用GPU训练深度学习模型