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

C语言结构体对齐

主要用于优化内存访问效率和跨平台兼容性,对齐规则决定了结构体成员在内存中的存储方式。

对齐规则

  • 每个成员的起始地址必须是该成员类型大小的整数倍,比如,int的起始地址通常必须是4的倍数
  • 结构体的总大小必须是其最大成员类型大小的整数倍
  • 可通过#pragma pack或__attribute__((packed))取消默认对齐,按1Byte紧凑排列

(1)内存浪费:

struct Example1 {char a;     // 1字节,起始地址0int b;      // 4字节,需对齐到4的倍数 → 起始地址4(填充3字节)short c;    // 2字节,起始地址8// 总大小:1(a) + 3(填充) + 4(b) + 2(c) = 10字节// 整体对齐:10不是4的倍数 → 填充2字节,最终大小12字节
};

(2)优化顺序:

struct Example2 {int b;      // 4字节,起始地址0short c;    // 2字节,起始地址4char a;     // 1字节,起始地址6// 总大小:4(b) + 2(c) + 1(a) = 7字节// 整体对齐:7不是4的倍数 → 填充1字节,最终大小8字节
};

(3)紧凑对齐

struct __attribute__((packed)) PackedExample {char a;     // 1字节,起始地址0int b;      // 4字节,起始地址1(无填充)short c;    // 2字节,起始地址5// 总大小:1(a) + 4(b) + 2(c) = 7字节(无需整体对齐)
};

C语言结构体对齐https://mp.weixin.qq.com/s/fwf9bywhVtR1yhKDP0vGJA 

http://www.dtcms.com/a/271137.html

相关文章:

  • SpringCloud系列 - xxl-job 分布式任务调度 (七)
  • 链表和数组和列表的区别
  • 力扣网编程150题:加油站(贪心解法)
  • Origin将Y偏移图升级为双Y轴3D瀑布图
  • SAP-ABAP:SAP中‘SELECT...WHERE...IN’语句IN的用法详解
  • 想要抢早期筹码?FourMeme专区批量交易教学
  • Cadence模块复用
  • SQL 视图与事务知识点详解及练习题
  • 基于Spring Boot+Vue的巴彦淖尔旅游网站(AI问答、腾讯地图API、WebSocket及时通讯、支付宝沙盒支付)
  • 等价矩阵和等价向量组
  • JavaScript基础篇——第五章 对象(最终篇)
  • 深度学习模型在C++平台的部署
  • 优化 FLUX.1 Kontext 以进行低精度量化的图像编辑
  • Flowable17错误事件---------------持续更新中
  • ali linux 安装libreoffice
  • Linux 系统 docker 部署 Dify
  • Airtest 的 Poco 框架中,offspring()
  • 【网络】Linux 内核优化实战 - net.ipv4.tcp_ecn
  • Protable 问题记录
  • 【RK3568+PG2L50H开发板实验例程】FPGA部分 | ROM、RAM、FIFO 的使用
  • 使用DDR4控制器实现多通道数据读写(十九)
  • 通过Tcl脚本命令:set_param labtools.auto_update_hardware 0
  • 闲庭信步使用图像验证平台加速FPGA的开发:第六课——测试图案的FPGA实现
  • 闲庭信步使用图像验证平台加速FPGA的开发:第七课——获取RAW图像
  • RAM带宽计算及分析
  • 双esp8266-01s间TCP通讯
  • 云服务器域名可以设置多少二级域名
  • 为什么Spring中推荐使用构造函数而不是@Autowired字段注入
  • WIFI协议全解析04:从芯片角度看WiFi协议:ESP32/8266 支持了哪些?
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘re’问题