1. 内存布局概览

2. 各区域详解
2.1 代码段
- 存储内容:存放汇编之后的机器指令、字符串常量和
constexpr
常量。 - 特点:是只读区,并且可以共享内存(多个进程可共用相同代码段)。
2.2 数据段
- 已初始化的数据段:存放已经显式初始化的全局/静态变量。
- 未初始化的数据段:存放没有显式初始化的全局/静态变量,程序加载时自动初始化为0。
2.3 堆区
- 存储内容:动态分配的内存(malloc, new)。
- 特点:(1)需要手动管理(free,delete。否则会内存泄漏)。(2)空间从低地址向高地址分配。(3)空间容易碎片化。
2.4 内存映射区
- 存储内容:动态库、文件映射(
mmap
)、共享内存。 - 位置:通常位于堆区和栈区中间。
2.5 栈区
- 存储内容:局部变量,函数调用时的上下文(函数参数,返回地址),临时变量。
- 特点:(1)自动管理(函数结束时自动释放)(2)空间从高地址向低地址分配。(3)空间默认不是很大,大概十几MB,容易发生栈溢出(递归层数过深)。
2.6内核空间
- 内容:进程调度,设备驱动。
- 权限:仅操作系统内核可以访问。
2.7 关键区域对比
区域 | 内容 | 增长方向 | 管理方式 | 大小 |
代码段 | 机器码/字符串常量 | 无 | 只读 | 程序决定 |
数据段 | 全局/静态变量 | 无 | 自动初始化 | 程序决定 |
堆区 | 动态分配的内存 | 低地址向高地址 | 手动释放 | 很大 |
栈区 | 局部变量/函数上下文 | 高地址向低地址 | 自动释放 | 十几MB |
3. 代码示例与内存对应
// 代码段(存储指令和字符串常量)
const char* str = "Hello"; // 字符串常量"Hello"在代码段
// 数据段(已初始化)
int global_init = 42; // Data段
// BSS段(未初始化)
static int global_uninit; // BSS段(初始化为0)
int main() {
// 栈区
int local_var = 10; // 栈帧中
// 堆区
int* heap_var = new int(100); // 堆分配
static int data = 0; //已初始化的静态变量在Data段
delete heap_var; // 手动释放
return 0;
}