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

__attribute__ ((__packed__))

__attribute__((__packed__)) 是一种编译器指令,用于告诉编译器在定义的结构体中以紧凑的方式存储数据。这意味着编译器不会在结构体成员之间插入任何填充字节,从而减少内存使用,确保结构体在内存中的大小与其成员大小的总和相等。

优点

  1. 内存效率:对于某些嵌入式系统或网络协议,内存空间可能非常有限,使用紧凑结构可以减少内存占用。
  2. 数据传输:在网络传输时,避免由于填充字节造成的数据不一致性,有助于确保数据的正确性。

注意事项

  1. 性能:虽然 __packed__ 可以节省空间,但有时可能会导致性能下降,因为某些硬件架构对未对齐访问的支持不佳。
  2. 可移植性:不同编译器对数据对齐的处理可能有所不同,因此使用此特性时需要考虑跨平台的兼容性。

总之,__attribute__((__packed__)) 在需要控制结构体内存布局的场景中非常有用,尤其是在处理网络协议时。

在 C 语言中,使用 __attribute__((__packed__)) 可以影响结构体的大小,具体体现在对齐方式的不同。

示例

考虑以下结构体定义:

typedef struct {
    uint8_t Type;           // 1 byte
    uint8_t Content_Type;   // 1 byte
    uint32_t Data_Length;   // 4 bytes
} mqtt_frame_head_t;

typedef struct {
    uint8_t Type;           // 1 byte
    uint8_t Content_Type;   // 1 byte
    uint32_t Data_Length;   // 4 bytes
} __attribute__((__packed__)) mqtt_frame_head_packed_t;

计算大小

  1. 未使用 __packed__ 的情况

    • Type 和 Content_Type 各占 1 字节,Data_Length 占 4 字节。
    • 由于对齐的原因,通常编译器会在 Type 和 Content_Type 后插入填充字节,使得 Data_Length 从一个 4 字节对齐的地址开始。
    • 结果大小可能是:1 + 1 + 2 (填充) + 4 = 8 字节
  2. 使用 __packed__ 的情况

    • 结构体成员将按顺序紧凑存储,不会有额外的填充字节。
    • 结果大小为:1 + 1 + 4 = 6 字节

总结

  • 未使用 __packed__:大小通常会是 8 字节(具体值依赖于编译器和平台)。
  • 使用 __packed__:大小为 6 字节。

这种大小差异在处理内存敏感的应用(如网络协议)时非常重要,因此选择是否使用 __packed__ 需要根据具体情况权衡。


http://www.kler.cn/a/378220.html

相关文章:

  • 智能诊断系统:AI可以辅助临床诊断,提高疾病诊断的准确性和效率
  • 网络原理(应用层)->HTTPS解
  • HTMLCSS:打造酷炫下载安装模拟按钮
  • C++进阶:unordered_map和unordered_set的使用
  • 基于大语言模型(LLM)自主Agent 智能体综述
  • 微服务架构面试内容整理-领域驱动设计(DDD)
  • 计算机网络:网络层 —— 路由信息协议 RIP
  • 智驭模板引擎管理系统(SmartTemplate Manager)
  • k8s环境下rabbitmq安装社区插件:rabbitmq_delayed_message_exchange
  • 施耐德EcoStruxure Machine SCADA Expert(EMSE)ModbusTcp通讯(二十二)
  • Linux系统安全配置
  • Javaweb梳理8——数据库设计
  • Servlet 3.0 新特性全解
  • 数据库作业5
  • 轻量数据持久化 shelve | sqlite3
  • AI风险及数据合规问题
  • js 期约到底是什么?
  • Ubuntu 系统Python环境管理(全、简)
  • Java项目实战II基于Spring Boot的文理医院预约挂号系统的设计与实现(开发文档+数据库+源码)
  • 全球首个国家级别的数据库CAB又在上海召开了!
  • C++之多态的深度剖析(2)
  • 砥砺十年风雨路,向新而行创新程丨怿星科技十周年庆典回顾
  • 【MySQL】存储引擎
  • 基于深度学习的智能交通信号控制
  • uniapp编译多端项目App、小程序,input框键盘输入后
  • 半成品 贪吃蛇项目