新闻详情

新闻详情

首页 / 资讯中心 / 详情

C结构体内存布局图解:Coursebook一课看懂struct

发布时间:2026/10/2 12:46:24来源:尧图网络
C结构体内存布局图解:Coursebook一课看懂struct
C结构体内存布局图解Coursebook一课看懂struct【免费下载链接】coursebookOpen Source Introductory Systems Programming Textbook for the University of Illinois项目地址: https://gitcode.com/GitHub_Trending/co/coursebook你是否发现sizeof打印出的结构体大小总比字段相加的直觉值大这篇文章以开源系统编程教材Coursebook美国伊利诺伊大学 CS 341 课程使用的入门级系统编程教科书为核心用图解方式带你一课看懂C结构体内存布局与struct padding结构体填充的完整原理。读完你不仅能手算对齐还能知道如何重排字段省下内存。为什么 C 结构体内存布局这么重要在 C 语言中struct结构体本质上就是一段连续的内存就像数组一样为所有成员预留空间但它可以混合存储不同类型的数据。In low-level terms, a struct is a piece of contiguous memory, nothing more. —— introc/c_memory_model.tex每个成员都占据一个明确的字节偏移byte offset。指针算术就是在这些偏移上做加减下面的图展示了块内存中指针如何从元数据一步步加到可用区、边界标签再到下一块但连续不等于紧凑——编译器可能悄悄在成员之间插入填充字节padding这就是结构体内存布局的精髓所在。从 6 格到 8 格教科书里的 struct packing 图解Coursebook 在附录中用一个picture结构体讲透了这件事源码见 appendix/appendix.texstruct picture { int height; // 4 字节 pixel** data; // 8 字节64位系统指针 int width; // 4 字节 char* encoding; // 8 字节 }按字段挨着放的直觉你应该认为它长这样——每格 4 字节共 6 格、24 字节严丝合缝然而在 64 位系统上编译器实际会生成8 格32 字节的布局——每个int后面都被塞进 4 字节填充让后面的 8 字节指针能落在对齐边界上 教材原话我们并不要求你手动打包结构体要知道编译器会做这件事。填充的根源在于早期至今CPU 按 32/64 位块读取内存请求的地址通常必须是块大小的倍数。对齐规则速算3 步手算 padding以 64 位系统为例int 4 字节指针 8 字节手算picture的布局只需 3 步步骤规则应用到 picture① 顺序排布成员按声明顺序放置height 从偏移 0 开始② 补齐对齐指针必须落在 8 的倍数处偏移 4 → 补 4 字节 padding③ 累加求总总大小也要取对齐的倍数24 字节 → 补齐到 32 字节 逐字段偏移一览字段偏移大小说明height04正常放置padding44⬅️ 隐形填充data888 字节对齐 ✅width164正常放置padding204⬅️ 隐形填充encoding2488 字节对齐 ✅结论sizeof(struct picture) 32而不是你以为的 24。8 字节的空隙slop就这样产生了。3 种解决方案让结构体更紧凑教材在 appendix/appendix.tex 给出了三种思路由推荐到冒险排序✅ 方案一重排字段首选把所有int放一起、指针放一起两个字段紧挨着就天然对齐了struct picture { int height; int width; // 448正好对齐 pixel** data; // 偏移 8 ✅ char* encoding; // 偏移 16 ✅ }总大小从 32 字节降到24 字节零代价。这是工程实践中最推荐的做法。 方案二packed 属性用__attribute__((packed, aligned(4)))强制编译器取消填充布局回到6 格理想图。但代价是处理器访问data或encoding时每次需要两次内存访问性能下降。 方案三接受填充如果处理器支持非对齐访问编译器也可能自己打包。对大多数业务代码32 vs 24 字节的差异无关痛痒保持可读性即可。真实世界TCP 头部也是结构体这种固定宽度字段 精确偏移的布局思想远不止 C 语言。Coursebook 网络章节画出的 TCP 头部就是经典范例——每个字段被精确安排进 32 位的行中注意底部同样有Padding填充——和 C 结构体填充异曲同工为了让总长度对齐、让接收方能快速定位每个字段。协议栈本质上就是跨机器共享的结构体内存布局约定这正是理解 struct padding 的最大价值布局不一致 数据错乱。图解出处见 networking/networking.tex。结构体内存布局速查清单int对齐到 4 字节边界指针/double对齐到 8 字节边界64 位 Linux 结构体总大小 末尾字段结束地址再补齐到最大成员对齐值的倍数 用sizeof验证、offsetof查看每个字段的真实偏移 字段声明原则按大小从大到小排列天然最小化 padding 跨语言/跨机器传输结构体时务必显式约定布局别依赖编译器默认行为学习路径Coursebook 中的相关文件想系统学习可以按以下路径阅读clone 地址git clone https://gitcode.com/GitHub_Trending/co/coursebook 结构体本质与变长尾introc/c_memory_model.texstruct关键字与字段访问语法introc/language_facilities.tex本篇核心Struct packing 完整图解appendix/appendix.tex 内存分配中的块布局实战malloc/malloc.tex 协议头布局案例networking/networking.tex️ 构建整本教材Makefile 一句话总结结构体 连续内存 对齐规则 隐形 padding。重排字段省空间sizeof验证布局就像 TCP 头部那样把每个字节都用在刀刃上。【免费下载链接】coursebookOpen Source Introductory Systems Programming Textbook for the University of Illinois项目地址: https://gitcode.com/GitHub_Trending/co/coursebook创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

基于MPC的微电网日前日内调度优化:Matlab实现指南 2026/10/2 14:12:30

基于MPC的微电网日前日内调度优化:Matlab实现指南

搞微电网调度优化的朋友,大概率绕不开MPC这三个字母。不管是光伏、储能、负荷怎么协调,还是并离网怎么切换,模型预测控制(Model Predictive Control)都像是带着水晶球开车——提前看一段路,再决定踩油门还是…

阅读更多 →
2026 开源圈第一炸:DeepSeek Harness 一天 10 万星,TaoToken 配置骨架先跑通 2026/10/2 14:12:30

2026 开源圈第一炸:DeepSeek Harness 一天 10 万星,TaoToken 配置骨架先跑通

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
视图库开发实战:从建表到查询的拿来即用示例与性能调优 2026/10/2 14:12:30

视图库开发实战:从建表到查询的拿来即用示例与性能调优

简介:这是一套基于Java开发的视图库(View Library)完整示例工程,面向需要快速集成视图库能力的后端开发者与系统集成人员,主打“拿来即用”。资源支持1400标准接入与级联,覆盖注册、心跳、注销、订阅、回调…

阅读更多 →
AI Engineering from Scratch:产线级AI系统手工锻造指南 2026/10/2 14:12:24

AI Engineering from Scratch:产线级AI系统手工锻造指南

1. 这不是“搭积木”,而是亲手锻造AI系统的底层逻辑“AI Engineering from Scratch”——看到这个标题,很多人第一反应是:又要从零写Transformer?又要手推反向传播?其实完全不是。我带过六支AI工程团队,从金…

阅读更多 →
国产MCU实战对比:STM32、GD32与CH32V103在真实项目中的表现与选型 2026/10/2 14:12:24

国产MCU实战对比:STM32、GD32与CH32V103在真实项目中的表现与选型

1. 从一块“不听话”的板子说起去年这个时候,我手里同时开着三块开发板:一块STM32F103C8T6的最小系统板,一块GD32F103C8T6的替代板,还有一块CH32V103C8T6的RISC-V评估板。三块板子引脚基本兼容,价格却差了一大截。当时…

阅读更多 →
【保姆级教程】用 WeChat 3.9 + Memotrace + Claude Code 复现前任 Skills:把 settings 改到 TaoToken 2026/10/2 14:12:24

【保姆级教程】用 WeChat 3.9 + Memotrace + Claude Code 复现前任 Skills:把 settings 改到 TaoToken

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉