程序运行时内存分布的典型布局

 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值