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
)的內存分配信息,結合鏈接腳本中定義的內存布局,最終匯總輸出統計報告。
通過此選項,開發者可以高效地監控程序內存使用,避免硬件資源溢出問題。