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

C语言结构体极简教程:重点吃透内存对齐

一、结构体基础

1.1 什么是结构体

结构体(struct)是自定义复合类型,可以把不同类型的数据打包在一起,用来描述一个复杂对象(如学生、用户)。

// 定义结构体类型

struct Student

{ char name[20]; int age; };

1.2 变量创建与初始化

1、创建变量

struct Student s1; // 常用方式

2、初始化方式

struct Student s1 = {"张三", 18}; // 顺序初始化 struct Student s2 = {.age = 20}; // 指定成员初始化(C99)

1.3 成员访问

  • 普通结构体变量:.点运算符

  • 结构体指针:->箭头运算符


二、重点:结构体内存对齐(面试必考)

2.1 核心问题

请看下面代码,请问结构体大小是多少?

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

答案:8字节,不是5字节。

原因:内存对齐,编译器自动填充空洞,并非简单累加字节。

2.2 什么是内存对齐

CPU不会逐字节读取内存,而是整块读取。编译器为了提高CPU读取效率,自动在成员之间补充空闲字节,让数据存放规整,这就是内存对齐。

2.3 内存对齐三大规则(必背)

默认对齐数:8(VS/GCC 默认)

  1. 规则1:第一个成员偏移量为0。

  2. 规则2:后续成员偏移量 =自身大小、默认对齐数较小值的整数倍。

  3. 规则3:结构体总大小 =最大成员、默认对齐数较小值的整数倍。

2.4 手把手推演案例

struct Test{ char a; // 1字节 int b; // 4字节 };
  1. a:偏移0,占用第0字节;

  2. b:自身大小4,偏移量必须是4的倍数;

  3. 补齐1、2、3字节(空洞填充);

  4. b从4开始,占用4~7;

  5. 总大小8,是最大成员4的整数倍,合规。

2.5 成员顺序影响内存大小

// 排布1:空洞大 struct T1{ char a; int b; char c; }; // 占用12字节 // 排布2:空洞小(优化后) struct T2{ char a; char c; int b; }; // 占用8字节

优化原则:把相同字节的成员放在一起。

2.6 手动修改对齐数

嵌入式/网络协议常用,强制压缩内存,消除填充空洞:

#pragma pack(1) // 设置对齐数为1 struct Test{ char a; int b; }; #pragma pack() // 恢复默认对齐

此时结构体大小 =5字节,无多余填充。


三、总结(极简背诵版)

  1. 结构体用来打包不同类型数据;

  2. 访问规则:普通用 . ,指针用 ->

  3. 内存对齐本质:牺牲内存,换CPU读取速度

  4. 熟记三大对齐规则,面试必考;

  5. 优化:相近字节成员集中摆放,减少内存空洞。

http://www.rkmt.cn/news/1309083.html

相关文章:

  • 2026沈阳贴车衣口碑TOP5排行,哪些汽车贴膜店口碑靠谱? - 资讯焦点
  • LLMRank:基于大模型排序学习的自动化评估方案与实践指南
  • 自动驾驶数字孪生框架ADDT:安全验证与故障模拟
  • 天虹兑换码回收避坑指南,新手选平台认准五大合规标准,别再被压价吞卡 - 京顺回收
  • C++ STL 容器完全指南(三):deque、list 与 map 深度详解
  • ‌纳斯卡线条测试:外星导航图的航空安全验证‌
  • 深圳刷屏朋友圈的纹眉,久匠真有网传那么厉害?原生眉形高级又自然 - 企业博客发布
  • 别再死记硬背了!用Python的NumPy库5分钟搞定矩阵行列式计算(附代码示例)
  • 终极指南:如何使用AppleRa1n工具安全绕过iOS 15-16激活锁
  • 微信立减金回收 不用勉强消费也能兑现的方法 - 团团收购物卡回收
  • 【NotebookLM图表描述生成实战指南】:20年AI工程师亲授3大避坑法则与5步精准生成法
  • AI智能体链上记忆库:赋予智能体历史感知与持续学习能力
  • Legacy iOS Kit深度解析:如何让经典iOS设备重获新生?
  • 我们最执着的“成功公式”,正在被85年数据无情证伪
  • 2026年临沂GEO优化,哪家专业公司脱颖而出?
  • 如何通过League Akari获得终极英雄联盟游戏体验:你的智能游戏助手完整指南
  • 放弃解压缩回退!在Nginx/Caddy上为Unity WebGL正确配置Brotli和Gzip压缩,提升加载性能
  • 人工智能、基础模型学术会议分享 - 每天学术做一点
  • 打破壁垒:APK安装器让Windows与Android应用无缝融合
  • Zotero-Style插件终极配置指南:解锁文献管理的超能力
  • Cursor Pro免费解锁终极指南:突破试用限制的完整解决方案
  • 为Hermes Agent配置自定义供应商接入Taotoken大模型平台
  • 基于Llama.cpp的本地AI智能体框架:从工具调用到多轮对话实践
  • 终极音乐解密指南:如何在3分钟内解锁你的加密音频文件
  • ExplorerPatcher卸载完全指南:安全移除Windows界面定制工具的正确方法
  • Gemini-Skill开源项目解析:轻量级AI技能包的设计与工程实践
  • KANBoost:基于Kolmogorov-Arnold网络的内存预取优化技术
  • 【NotebookLM数据分析黄金法则】:20年数据科学家亲授5大避坑指南与实时优化策略
  • 群晖Photos人脸识别终极补丁:让DS918+等设备重获AI照片管理能力
  • 为什么83%的用户误读NotebookLM引用溯源?一文讲透证据链完整性校验四步法