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

简单理解:加个 .c 文件,代码体积反而变小?

工程中添加了.c文件(比如NOR_FLASH.c)后,不仅没报错,还出现 “内存占用变小” 的情况,这是 Keil 编译器链接优化机制导致的正常现象,核心原因不是 “加文件占空间少”,而是新增文件触发了编译器的 “代码复用 / 垃圾回收” 优化,我会用通俗的方式拆解:

先纠正认知:不是 “加文件让内存小”,是 “优化生效更充分”

你看到的Program Size变小,本质是:原来的工程中,编译器的--gc-sections(垃圾回收)、-Os(大小优化)等选项,因为代码量少 / 模块单一,优化效果有限;新增.c文件后,编译器在链接阶段能更充分地:

  1. 复用公共代码:比如新增的NOR_FLASH.c和原有模块都用到了memcpy/strlen等库函数,编译器只保留一份函数实现,避免重复链接;
  2. 精准回收未用代码:新增模块后,编译器能更清晰地区分 “被调用的代码” 和 “未被调用的代码”,把后者彻底移除;
  3. 优化段分配:多个.c文件的代码段(.text)分开后,编译器能更高效地合并 / 压缩段空间,减少段对齐带来的 “内存碎片”。

具体原因拆解(用你的工程数据举例)

你的工程优化后:

Program Size: Code=28000 RO-data=2420 RW-data=24 ZI-data=12744

对比之前的错误版本,Code段从 “超出容量” 降到 28KB,核心是这 3 个优化机制:

1. 垃圾回收(--gc-sections)更充分
  • 无新增文件时:工程只有核心模块(GPIO/I2C/USART),代码段少,编译器没多少 “未用代码” 可回收;
  • 新增 NOR_FLASH.c 后:编译器会扫描所有.c文件的函数调用关系,比如:
    • NOR_FLASH.c中定义了NOR_FLASH_Read(),但你没调用 → 直接移除;
    • 原有main.c中未调用的IIC_ReadWriteTest()→ 一并移除;最终 “有用的代码总量” 反而变少,Code段自然减小。
2. 库函数复用(MicroLIB 机制)
  • Keil 的MicroLIB(轻量级库)会把printf/memcpy/strlen等库函数做成 “共享段”;
  • 新增.c文件后,编译器发现多个模块都依赖同一个库函数 → 只链接一份,避免重复占用空间;比如:main.cNOR_FLASH.c都用了memcpy,原来可能链接两份,现在只链接一份,节省了重复代码的空间。
3. 代码段对齐优化
  • 每个.c文件编译后会生成独立的代码段(.text),段大小会按 4/8 字节对齐(比如 10 字节的代码会占 12 字节);
  • 少量.c文件时,“对齐浪费” 比例高(比如 1 个文件浪费 2 字节,占比 20%);
  • 多个.c文件时,“对齐浪费” 被分摊(比如 5 个文件总共浪费 8 字节,占比仅 0.1%),整体Code段的 “有效利用率” 提升,看起来就变小了。

举个直观的例子

场景代码段组成实际占用对齐浪费总占用
仅 main.c(无新增)main.text (100 字节)1004 字节104
加 NOR_FLASH.c 后main.text(80) + nor.text(20)1000 字节(刚好对齐)100
→ 总占用从 104→100,看起来 “加文件后内存变小”。

总结

  1. 核心原因:新增.c文件触发了编译器更充分的链接优化(垃圾回收、库函数复用、段对齐),而非 “新增文件本身占空间少”;
  2. 关键机制--gc-sections(移除未调用代码)、MicroLIB(库函数共享)、-Os(代码压缩)是核心;
  3. 实用结论
    • 这种 “加文件内存变小” 是正常现象,说明你的优化配置(Size 优化、MicroLIB、垃圾回收)都生效了;
    • 后续新增模块时,只要保留这些优化配置,编译器会自动 “瘦身”,无需担心代码量增加导致空间不足;
    • 若想进一步减小内存,可继续移除未调用的函数 / 模块,或替换printf等大体积函数。

简单来说:不是 “加文件让内存小”,是 “加文件让编译器的优化功能发挥得更好”,最终保留的 “有用代码” 更少,内存自然变小。

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

相关文章:

  • 销售产品亮点数字拆解图,客户一看就懂。
  • json-server 本地 restful api - 何苦
  • 技术文档散落在GitLab/Confluence?PandaWiki用AI检索+IDE集成解决了我的痛点
  • 2026年全国不锈钢板厂家哪家优质?靠谱耐用 适配各类工程场景 覆盖多区域多行业需求 - 深度智识库
  • 2026年实木猫爬架厂家推荐:多功能猫爬架/固定形猫爬架/毛毡猫抓板厂家精选 - 品牌推荐官
  • leetcode 1404. 将二进制表示减到 1 的步骤数 中等
  • 2026年哈尔滨冠心病早搏厂家最新推荐:哈尔滨冠心病心血管狭窄/哈尔滨冠心病房颤/哈尔滨偏瘫半身不遂/选择指南 - 优质品牌商家
  • PostgreSQL 官方仓库 进行升级的推荐步骤(这也是最稳妥的方法) - a
  • 镜像视界 · 跨场景空间控制体系——经济技术开发区连续目标追踪系统
  • API风险监测系统:从“静态防护”走向“数据流转安全”的智能底座
  • 2026视黄醇亚油酸酯哪家好?温和抗老原料选择指南 - 品牌排行榜
  • 2026年钢制电动医用门厂家推荐:彩钢墙电动医用门/特殊科室平移门/医疗土建墙平移门厂家精选 - 品牌推荐官
  • 政务行业高性能、动态、多架构数据安全泛监测体系实践方案
  • 2026年评价高的高效速溶融雪剂公司推荐:无氯环保融雪剂/氯化钙增强融雪剂/混合型环保融雪剂/环保低腐蚀融雪剂/选择指南 - 优质品牌商家
  • 基于OpenGL的3D烟花粒子系统设计方案
  • 你最好学点中文——中文的文明优势与时代力量
  • node到前端,文件的传输过程
  • 2026年洗衣机公司权威推荐:酒店洗衣机批发、全自动布草洗涤设备、医院洗衣机、工业洗衣机厂家选择指南 - 优质品牌商家
  • 真心不骗你!MBA专属降AI率工具,千笔·降AIGC助手 VS 灵感风暴AI
  • 多组学之互作组—RNA结合蛋白
  • 探寻2026年OMO电商零售新趋势,这些平台不容错过,OMO全渠道零售电商,OMO模式电商零售平台口碑排行 - 品牌推荐师
  • 【实战】用 AI 吃透 Git Commit:从代码修改到原理拆解 + 学习规划
  • 2026视黄醇亚油酸酯选哪家?温和抗老原料选购参考 - 品牌排行榜
  • 基因和蛋白书写规范
  • 2026年远程io厂家推荐:行业技术实力品牌盘点 - 品牌排行榜
  • Spring缓存注解全解析:五大核心注解属性详解与实战示例
  • 全场景人力外包服务商精选,五大品牌解锁企业用工新效率 - 包罗万闻
  • 方盾滤毒防尘面罩使用四大误区,别让防护形同虚设
  • 2026年耐磨热电偶厂家推荐:K型热电偶/B型热电偶/铠装热电偶厂家精选 - 品牌推荐官
  • 鸿蒙应用开发UI基础第十一节:弹性布局Flex核心讲解与实战演示 - 鸿蒙