一个C/C++程序经过编译后,占用的内存主要分为以下5个部分 (地址由高到低)
1、栈区(stack) — 运行时分配
2、堆区(heap)— 运行时分配
3、全局区(静态区static) — 保存在 ELF 可重定位目标文件中
(1)已初始化的全局(静态)变量:.data段
(2)未初始化的全局(静态)变量:.bss段
4、文字常量区 — 保存在 ELF 可重定位目标文件中的 .rodata 段
5、程序代码区 — 保存在 ELF 可重定位目标文件中的 .text 段
栈区:由编译器自动分配和释放。
栈区存放的内容:
(1)函数的返回地址和函数的参数。
(2)函数在调用前后需要保持、不变的寄存器。
(3)函数的非静态(static)局部变量以及编译器自动生成的其他临时变量。
在C/C++程序中:主函数,中断服务函数,以及多任务系统(RTOS)中的任务函数 ,或者linux系统中的进程,它们的执行都需要各自运行栈的支持。
堆区:由程序员调用 malloc 函数主动申请,需要释放时调用 free 函数释放。