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

C语言内存管理——内存对齐与共用体union

C语言内存管理——内存对齐与共用体union

前言

在C语言中,内存管理是程序员必须掌握的核心技能。本文将深入探讨两个重要概念:内存对齐共用体(union)。理解它们不仅能帮你写出更高效的代码,还能在面试中脱颖而出。


一、内存对齐

1.1 什么是内存对齐

不管是结构体,还是普通的变量,都存在内存对齐的现象。简单来说,内存对齐就是数据只能存放在自己类型整数倍的内存地址上。

对齐规则:数据只能放在自己类型整数倍的内存地址上。简单理解:内存地址 ÷ 占用字节 = 可以整除。

1.2 常见类型的对齐规则

数据类型占用字节对齐要求
char1字节内存地址能被1整除(任意位置)
short2字节内存地址能被2整除
int / float4字节内存地址能被4整除
long long / double8字节内存地址能被8整除

1.3 结构体的内存对齐

结构体的内存对齐在上面的基础上又多了一条规则:

⚠️结构体总大小规则:结构体的总大小必须是其内部最大类型的整数倍(用来确定最后一个数据补位的情况)。

来看一个例子:

structExample{chara;// 1字节intb;// 4字节charc;// 1字节};// 内存布局(假设起始地址为0):// 地址0: a (char, 1字节)// 地址1-3: 补3个空字节(int需要4字节对齐)// 地址4-7: b (int, 4字节)// 地址8: c (char, 1字节)// 地址9-11: 补3个空字节(总大小需是int的整数倍,即4的倍数)// 总大小:12字节

注意:对齐的时候会补空白字节,但是不会改变原本字节的大小。char补位之后,本身还是1个字节。

1.4 优化技巧

为了节约空间,我们通常会把小的数据类型写在最上面,大的数据类型写在最下面。

// 优化前:12字节structBad{chara;// 1字节intb;// 4字节charc;// 1字节};// 优化后:8字节structGood{chara;// 1字节charc;// 1字节(小的放一起)intb;// 4字节};

只是调整了成员顺序,就从12字节减少到了8字节,节省了33%的空间!


二、共用体union

2.1 什么是共用体

共用体,也叫联合体、共同体,是一种特殊的数据类型。它的特点是:所有成员共享同一块内存空间

2.2 共用体的特点

  1. 所有的变量都使用同一个内存空间
  2. 每次只能给一个变量进行赋值,因为第二次赋值时会覆盖原有的数据
  3. 所占的内存大小 = 最大成员的长度(也受内存对齐影响)
#include<stdio.h>unionData{inti;floatf;charc;};intmain(){unionData data;data.i=10;printf("i = %d\n",data.i);// i = 10data.f=3.14f;printf("f = %.2f\n",data.f);// f = 3.14printf("i = %d\n",data.i);// i的值被覆盖了,变成垃圾值printf("sizeof(union Data) = %zu\n",sizeof(unionData));// 4字节return0;}

2.3 共用体的内存大小

  • 以最大的单个成员的长度为准
  • 总大小一定是最大单个成员的整数倍
  • 同样受内存对齐规则的影响

三、结构体和共用体的区别

对比项结构体 struct共用体 union
含义一种事物中包含多个属性一个属性有多种类型
存储方式各存各的,互不影响存一起,多次存会覆盖
内存占用各个变量的总和(受内存对齐影响)最大类型的大小(受内存对齐影响)
使用场景描述一个对象的多个属性节省内存、类型转换、协议解析

四、总结

  • 内存对齐:是CPU访问效率的优化机制,记住"小的放前面"的优化原则
  • 共用体:所有成员共享内存,适合"同一时间只用一种类型"的场景
  • 结构体 vs 共用体:结构体是"与"的关系,共用体是"或"的关系

掌握这些内存管理的细节,能让你对C语言的底层机制有更深刻的理解。

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

相关文章:

  • 5分钟掌握ExtDiff:终极免费的Word文档差异比较工具
  • 如何快速配置文件备份工具:ChoEazyCopy 完整教程
  • Win11Debloat终极指南:3分钟让Windows系统性能提升50%的完整教程
  • 鹤壁婚宴宴席,备酒水不浪费又体面
  • 3步掌握高效窗口管理:DockDoor终极工作流优化指南
  • Windows运维体验AMD AI云:领取算力到跑通PyTorch
  • 对象存储的适用场景
  • 公寓管理系统选型趋势:门店经营正在进入总部视角
  • OpenCompass大模型评测实战:从原理到应用
  • 客户进厂考察,3 个细节决定是否下单
  • 售后负责人视角抖店售后工具怎么选重点看退货地址和补发记录
  • 企业财税风控实操指南:从“裸奔”到“合规”的架构设计与数据排查
  • 破解城镇化与生态健康耦合难题、迈向精细化人地关系研究:基于GIS、RS、VORS模型、CCDM模型geodetecto集成的生态系统健康的耦合协调分析
  • 企业级 AI 落地的一个现实转向:为什么开始强调复制专家判断,而不是放大 Agent 自主权
  • Cantian connector for MySQL高可用性设计:故障快速恢复机制详解
  • LLM 学习笔记 Day 5:Agent 核心组件——Planner、Memory 与 Reflection
  • AI Agent 入门实战:用 Function Calling 让大模型学会调用工具
  • Python特征工程实战:从数据清洗到模型提效的完整流程(附可运行代码)
  • 剪映、PS C盘占用几十G怎么办?我用一个工具,5分钟多出23G
  • 五款热门红茶礼盒客观测评推荐:老茶客精选,送礼倍有面儿
  • 【Claude Code】Fable 5 提示指南
  • 线上模型抖动真相:偏差-方差动态权衡实战诊断与干预
  • 英语学习交流平台小程序-ssm+app
  • 我用真实业务代码,榨干了 ChatGPT、Claude 和 Gemini 的极限
  • Figma界面如何快速实现中文汉化?设计师必备的本地化解决方案
  • 沧州MBR膜清洗服务测评:晶源环保效果佳但响应与价格有短板
  • 2026最新5款AI编程助手平替实测合集
  • tree-sitter:编辑器里的语法解析,靠它撑着
  • SpringBoot 整合 WebSocket——实时消息推送实战
  • Cursor 连接慢、AI 代码补全无响应怎么办?开发者 AI 编程工具网络优化指南