一个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 函数释放。
若申请了堆区的内存之后忘记释放,很容易造成内存泄漏。频繁地申请和释放堆区内存会产生堆区碎片。
全局区(静态区static):存放程序的数据(程序 = 指令 + 数据)。
文字常量区:存放程序的数据(程序 = 指令 + 数据)。
程序代码区:存放程序的指令(程序 = 指令 + 数据)。
-------------------------------------------------------分割线------------------------------------------------------------
举例分析:
int a = 6;
main()
{
static int b = 7
char * str = “hello”;
char str[ ] = “world”;
const int c = 8;
retrun 0;
}
------在语句 int a = 6;中,初始值 6 存放在 .data 段。
------在语句 static int b = 7;中,初始值 7 存放在 .data 段。
------在语句 char * str = “hello”;中, “hello” 存放在 .rodata 段,指针变量 str 存放在栈区 。
------在语句 char str[ ] = “world”;中,"world"是通过立即数的形式作为指令的一部分,存放在 .text 段,字符数组 str[ ] 存放在栈区。
------在语句 const int c = 8;中,初始值 8 是通过立即数的形式作为指令的一部分,存放在 .text 段,局部变量 c 存放在栈区。
------特别注意:const修饰的变量并不在 .rodata 段,它只是将修饰的变量设置为只读。该变量原来在什么位置,经过const修饰之后仍然在原来的位置。
来源:CSDN
作者:Terence_cs
链接:https://blog.csdn.net/qq_46057667/article/details/104111688