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

串口传输结构体:需要考虑结构体对齐的问题#pragma pack (1)

串口传输结构体:需要考虑结构体对齐的问题,否则会有多出一些乱七八糟的的数据。

#pragma pack(1)99% 的场景都是用在结构体上,核心作用就是:取消字节对齐,让结构体内存紧凑、无空隙、无冗余

一、#pragma pack (1) 到底是干嘛的?

一句话:让结构体成员之间 “紧贴排列”,不插入任何填充字节(内存对齐空隙)。

默认情况下,C 编译器会对结构体做字节对齐,目的是让 CPU 读取更快,但会浪费内存#pragma pack(1)就是强制1 字节对齐 = 不浪费任何空间


二、默认对齐(不用 pack)会产生什么问题?

看这个结构体:

struct Test { char a; // 1 字节 int b; // 4 字节 short c; // 2 字节 };

默认对齐下大小 = 12 字节!但实际有效数据只有:1+4+2 =7 字节浪费了5 字节填充

内存布局是这样的:

a [填充3] b c [填充2] 1B 3B 4B 2B 2B

这就是:数据冗余


三、加上 #pragma pack (1) 之后

#pragma pack(1) // 1字节对齐 struct Test { char a; int b; short c; }; #pragma pack() // 恢复默认对齐

大小 = 1+4+2 = 7 字节!没有任何填充,没有任何冗余!

内存布局:

a b c 1B 4B 2B

四、为什么要用 #pragma pack (1)?(最关键)

主要用在 3 种场景:

1.串口 / 网络 / 蓝牙 通信协议

发送方和接收方必须结构体内存布局完全一致,不能有填充字节,否则解析错误。

2.读写 Flash / 文件

要保证结构体大小固定,不因为编译器不同而变化。

3.节省内存(嵌入式特别常用)

单片机 RAM 很小,必须紧凑存储。


五、正确写法(必须会)

#pragma pack(1) // 开启1字节对齐 struct MyData { uint8_t head; uint16_t len; uint32_t data; }; #pragma pack() // 关闭,恢复默认对齐

一定要成对使用!否则会影响后面所有结构体。

http://www.cnnetsun.cn/news/1794528.html

相关文章:

  • OpenClaw自动化测试实践:Qwen3-14B驱动的CI/CD辅助方案
  • 从自动驾驶到医疗成像:一台AWG如何撬动超声MEMS的百亿市场?
  • 【OpenClaw】通过 Nanobot 源码学习架构---()总体患
  • Go 语言构建 Agent 服务的优势
  • OpenClaw语音控制扩展:千问3.5-27B实现本地语音指令识别
  • CAN + 以太网 + Wi-Fi + BLE + TCP/IP + MQTT +HTTP协议层级
  • 效率提升50%:OpenClaw+Kimi-VL-A3B-Thinking自动化周报生成方案
  • AI动态经济图谱技术融资800万
  • C#/.NET/.NET Core优秀项目和框架2026年3月简报
  • Awesome-TTRSS移动端完美适配:随时随地享受RSS阅读
  • Big-O 表示法简介(基础入门)
  • Beyond All Reason多人对战攻略:团队协作与战术配合的黄金法则
  • React Native Collapsible实战案例:从电商应用到社交平台的完整实现
  • 快速上手LexikJWTAuthenticationBundle:10分钟搭建安全API认证系统
  • CatGFX:ESP32驱动CAT热敏打印机的Adafruit GFX兼容库
  • MSGEQ7音频频谱芯片驱动设计与抗干扰实践
  • SecretFlow机器学习算法库:线性模型、决策树、朴素贝叶斯全解析
  • 大模型风口来袭!揭秘AI四大热门方向及高薪就业前景
  • OpenClaw多用户场景:为团队成员分配不同Kimi-VL-A3B-Thinking使用权限
  • 聊一聊 C# 中的闭包陷阱:foreach 循环的坑你还记得吗?募
  • OpenClaw个人知识库:Qwen3-14b_int4_awq自动标注与关联文档
  • [特殊字符] 第88课:目标和
  • 从人脑自幼年成长到成熟的过程看机器脑和ai的演进:一切都已经无法改变了吗?(4)
  • OpenClaw对接Qwen2.5-VL-7B图文模型:5步实现本地自动化图文处理
  • UE4SS技术指南:从入门到精通的Mod开发系统
  • 如何实现SQL字段值联动修改_通过触发器处理相关联字段
  • 零代码自动化:用Gemma-3-12b-it为OpenClaw定制个人技能库
  • 和AI一起搞事情#:边剥龙虾边做个中医技能来起号牙
  • OpenClaw性能白皮书:百川2-13B-4bits量化模型在自动化任务中的表现
  • cka-2026-ConfigMap