C/C++内存分区
首先要清楚一点,程序未运行和运行时是有一点区别的
程序运行时主要分区
1.栈区
2.堆区
3.全局/静态区
4.常量区
5.代码区
栈区
- 由编译器自动分配释放,用于存放函数形参、返回地址、返回数据、局部变量数据
- 由高地址向低地址扩展的一块连续的内存区,向下生长的,也就是向着内存地址减小的方向
- 效率高,但分配内存有限,程序员无法控制
堆区
- 程序员分配释放的空间,程序结束时可能由系统回收
- 由低地址向高地址扩展的一块不连续的内存区域,向上生长的,也就是向着内存地址增加的方向
- 存储方式类似于链表,遍历空闲地址的链表,寻找第一个空间大于申请大小的空间
- 动态内存开辟,效率较慢,容易产生内存碎片
堆栈的不同
栈区 | 堆区 | |
---|---|---|
分配方式不同 | 系统分配 | 程序员分配 |
空间大小不同 | 空间较小 | 空间较大 |
分配效率不同 | 效率高 | 效率低 |
产生内存碎片不同 | 不产生碎片 | 产生碎片 |
生长方向不同 | 向下生长 | 向上生长 |
全局/静态区
可为未初始化的全局/静态变量 和 已初始化的全局/静态变量
未初始化的全局/静态变量
- 代码编译后,未初始化或值为0的全局变量、静态变量,只记录数据大小,不分配空间,只有当程序运行时,才分配对应的内存空间给该变量
已初始化的全局/静态变量
- 已初始化全局变量、静态变量正常分配空间
代码常量区
- 常量就是放在该区。 程序结束后由系统释放
- 该区数据不可修改,因此内存报错时可能是修改了无法修改的内存值
代码区
- 存放代码文本(二进制)的区域