GCC 的 --print-memory-usage
选项用于在编译链接过程中输出程序的内存占用统计信息,特别适用于嵌入式开发等内存受限的场景。其主要作用和输出内容如下:
核心功能
-
显示内存分段占用
输出程序在目标设备内存中的分段占用情况,通常包括:- FLASH/ROM:存放代码(
.text
)和只读数据(.rodata
) - RAM:存放已初始化数据(
.data
)、未初始化数据(.bss
)和堆栈(stack
/heap
)
- FLASH/ROM:存放代码(
-
百分比统计
计算各分段占用相对于总内存大小的百分比,直观反映资源利用率。
使用示例
gcc --print-memory-usage -o output.elf input.c
典型输出
Memory region Used Size Region Size %age UsedFLASH: 15200 B 64 KB 23.19%RAM: 4500 B 16 KB 27.47%
关键解读
字段 | 说明 |
---|---|
FLASH | 程序代码 + 常量数据(烧录到芯片的只读存储) |
RAM | 运行时变量(全局/静态变量 + 堆栈空间) |
Used Size | 实际占用的字节数 |
Region Size | 链接脚本中定义的内存区域总大小(通常来自 .ld 文件) |
%age Used | 使用率 = (Used Size / Region Size) * 100 |
应用场景
- 嵌入式开发
快速检查代码是否超出芯片的 FLASH/RAM 容量限制(如 STM32、AVR 等)。 - 内存优化
对比不同编译选项(如-Os
优化)对内存占用的影响。 - 资源评估
评估新增功能是否会超出硬件内存限制。
注意事项
- 依赖链接脚本:内存区域定义基于链接器脚本(
.ld
文件),若未自定义则使用 GCC 默认配置。 - 需完整链接:必须与链接选项(如
-T script.ld
)一起使用才能获取准确统计。 - 平台支持:更常见于 ARM Cortex-M、AVR 等嵌入式工具链(如
arm-none-eabi-gcc
)。
工作原理
GCC 在链接阶段通过链接器(通常是 ld
)收集各目标文件(.o
)的内存分配信息,结合链接脚本中定义的内存布局,最终汇总输出统计报告。
通过此选项,开发者可以高效地监控程序内存使用,避免硬件资源溢出问题。