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%的空间二、共用体union2.1 什么是共用体共用体也叫联合体、共同体是一种特殊的数据类型。它的特点是所有成员共享同一块内存空间。2.2 共用体的特点所有的变量都使用同一个内存空间每次只能给一个变量进行赋值因为第二次赋值时会覆盖原有的数据所占的内存大小 最大成员的长度也受内存对齐影响#includestdio.hunionData{inti;floatf;charc;};intmain(){unionData data;data.i10;printf(i %d\n,data.i);// i 10data.f3.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语言的底层机制有更深刻的理解。