当前位置: 首页 > 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.jsqmd.com/news/838747/

相关文章:

  • 如何快速掌握Joy-Con Toolkit:专业用户的完整配色定制指南
  • 自动驾驶数字孪生框架ADDT:安全验证与故障模拟
  • 水鬼走时突然不准?先别急着送修,揭秘无锡劳力士3135机芯保养背后的五个真相,附全国门店实拍 - 亨得利官方维修中心
  • C++ STL 容器完全指南(三):deque、list 与 map 深度详解
  • 【Unity进阶解析】Prefab 核心机制与实战避坑指南
  • 天虹兑换码回收避坑指南,新手选平台认准五大合规标准,别再被压价吞卡 - 京顺回收
  • 封闭浸泡式学习,广州环球雅思封闭班价格与价值解析 - 服务品牌热点
  • WorkBuddy 和 OpenClaw 有什么区别?2026最全对比指南 - 资讯焦点
  • VisualCppRedist AIO:Windows系统DLL缺失问题的终极解决方案
  • Cursor Pro终极破解指南:免费解锁AI编程助手完整教程
  • 天虹购物卡回收:省心途径全解析 - 购物卡回收找京尔回收
  • Loop窗口透明度管理:优雅实现Mac多任务分层工作流
  • 你的劳力士“心脏”多久没体检了?从机芯保养看十年以上老款腕表如何重获新生,南京表主必读 - 亨得利官方维修中心
  • 深圳刷屏朋友圈的纹眉,久匠真有网传那么厉害?原生眉形高级又自然 - 企业博客发布
  • ‌纳斯卡线条测试:外星导航图的航空安全验证‌
  • 在 GitHub Actions 中集成 Taotoken 大模型 API 实现自动化代码审查
  • 微信立减金回收 不用勉强消费也能兑现的方法 - 团团收购物卡回收
  • 2026年西北文旅升温下的出行变革:宁夏大巴与旅游包车企业深度梳理 - 深度智识库
  • Cursor AI试用限制的实用解决方案:机器ID重置与Pro功能恢复
  • FFXIV TexTools终极指南:艾欧泽亚外观定制完全解析
  • 实战突破:5分钟构建企业级InstaVote分布式投票平台
  • 【NotebookLM图表描述生成实战指南】:20年AI工程师亲授3大避坑法则与5步精准生成法
  • Eclair语言:基于Datalog的声明式硬件设计新范式
  • SteamAutoCrack终极指南:3步实现游戏免Steam启动的完整教程
  • 如何轻松下载B站4K高清视频:Python下载工具完全指南
  • 人工智能、基础模型学术会议分享 - 每天学术做一点
  • 放弃解压缩回退!在Nginx/Caddy上为Unity WebGL正确配置Brotli和Gzip压缩,提升加载性能
  • 基于MQTT与Adafruit IO的物联网数据可视化与控制系统实践
  • 支付宝红包套装变现的正确打开方式 - 团团收购物卡回收
  • 群晖照片人脸识别补丁:让DS918+等设备也能享受AI照片管理