一個由 C/C++ 編譯的程序在運行時佔用的內存主要分為以下五個部分:
malloc/new)與釋放(free/delete)。static)。"abc")。[cpp]
// main.cpp
int a = 0; // 全局初始化區 (.data)
char *p1; // 全局未初始化區 (.bss)
int main() {
int b; // 棧區
char s[] = "abc"; // "abc" 在常量區,s 在棧
char *p2; // 棧區
char *p3 = "123456"; // "123456" 在常量區,p3 在棧
static int c = 0; // 全局/靜態初始化區 (.data)
p1 = (char*)malloc(10); // 堆區
p2 = (char*)malloc(20); // 堆區
strcpy(p1, "123456"); // "123456" 在常量區,編譯器可能優化合併
return 0;
}
| 維度 | 棧 | 堆 |
|---|---|---|
| 管理方式 | 編譯器自動 | 程序員手動 |
| 空間大小 | 較小(~1MB) | 極大(~4GB) |
| 碎片問題 | 無(LIFO) | 易產生碎片 |
| 生長方向 | 向低地址 | 向高地址 |
| 分配效率 | 極高(專用指令) | 較低(需搜索/系統調用) |
static 全局變量:僅在定義文件內可見,降低耦合。static 局部變量:改變存儲方式(從棧移至靜態區),延長生命周期,僅初始化一次。static 函數:僅在本文件內可見(內部函數),避免名稱衝突。理解內存佈局有助於排查野指針、內存洩漏、棧溢出等問題,也是編寫高性能、穩健 C/C++ 代碼的基礎。