+----------------------+ 高地址
| 栈区 (Stack) |
+----------------------+
| 堆区 (Heap) |
+----------------------+
| BSS段 (未初始化数据) |
+----------------------+
| 数据段 (已初始化数据)|
+----------------------+
| 代码段 (Text) |
+----------------------+ 低地址
1. 栈区(Stack)
- 栈区主要存储局部变量、函数调用的参数和返回地址。
- 栈是由系统自动管理的,它的内存分配和释放速度非常快。
- 栈的特点是 "后进先出"(LIFO),函数调用时,新的栈帧会压入栈顶,函数返回时会将栈帧弹出。
- 栈区的内存大小是有限的,因此局部变量和递归的层数都有一个最大限制。
2. 堆区(Heap)
- 堆区用于动态内存分配,程序运行时可以通过
new
或malloc
函数动态分配内存,使用delete
或free
释放内存。 - 堆区由程序员手动管理,不同于栈区自动管理,堆内存的使用更加灵活,但是也更容易出现内存泄漏和内存碎片问题。
- 堆的内存分配相对较慢,因为操作系统需要找到合适的内存块,并在释放时可能需要进行合并操作。
3. 数据段(Data Segment)
- 数据段又分为两部分:
- 全局数据段(静态数据段): 存放初始化的全局变量和静态变量(
static
变量),这些变量在程序整个生命周期中保持在内存中。 - BSS 段: 存放未初始化的全局变量和静态变量,这些变量在程序加载时会被初始化为 0。
- 全局数据段(静态数据段): 存放初始化的全局变量和静态变量(
- 数据段的内存由操作系统在程序启动时分配,程序结束时释放。
4. 代码段(Code Segment 或 Text Segment)
- 代码段存放程序的可执行代码,也称为 文本段,这是程序指令所在的内存区域。
- 代码段通常是只读的,防止程序意外修改指令。
- 程序执行时,CPU 从代码段取指令,逐条执行。
5.栈和堆的主要区别:
1)管理方式不同:栈是系统自动管理的,在出作用域时,将自动被释放;堆需手动释放,若程序中不释放,程序结束时由操作系统回收。
2)空间大小不同:堆内存的大小受限于物理内存空间;而栈就小得可怜,一般只有8M(可以修改系统参数)。
3)分配方式不同:堆是动态分配;栈有静态分配和动态分配(都是自动释放)。
4)分配效率不同:栈是系统提供的数据结构,计算机在底层提供了对栈的支持,进栈和出栈有专门的指令,效率比较高;堆是由C++函数库提供的。
5)是否产生碎片:对于栈来说,进栈和出栈都有着严格的顺序(先进后出),不会产生碎片;而堆频繁的分配和释放,会造成内存空间的不连续,容易产生碎片,太多的碎片会导致性能的下降。
6)增长方向不同:栈向下增长,以降序分配内存地址;堆向上增长,以升序分配内存地址