目录
为什么要了解内存布局?
想象一下,你搬进了一栋新房子,却不知道卧室、厨房、卫生间、杂物室....分别在哪儿,你每天起床找个马桶都跟玩密室逃脱似的,是不是很崩溃?
计算机的内存就像你的"数字房子",不了解它的布局,代码写着写着就容易"走错房间",结果就是 ------ 程序崩溃,电脑蓝屏,领导白眼...
内存的"房间"都有哪些?
高地址 +------------------+
| 环境变量区 | ← 环境变量(房间的空气)
+------------------+
| 命令行参数区 | ← 命令行参数(入户门)
+------------------+
| 栈区 | ← 函数调用,局部变量
| |
+------------------+
| ↓↓↓ | ← 栈向下增长
| |
+------------------+
| 自由 | ← 未使用的内存空间
| |
+------------------+
| ↑↑↑ | ← 堆向上增长
| |
+------------------+
| 堆区 | ← 动态分配内存
| |
+------------------+
| 未初始化数据段 | ← 未初始化的全局变量
| (BSS段) |
+------------------+
| 已初始化数据段 | ← 已初始化的全局变量
| (Data段) |
+------------------+
低地址 | 代码段 | ← 程序的指令代码
+------------------+
下面就模拟一个程序运行起来的,从程序的视觉看看,一个程序都需要住进哪几个房间,这些房间都提供了什么服务。
一个程序能运行起来,需要如下几个步骤:
- 用代码编译出来的执行包;
- 运行执行包的时候,需要向系统申请内存存储变量,和调用计算指令。
系统不会预先分配固定内存,而是根据程序需求动态调整。
每个内存房间都有特定的功能,当然也有所受的限制。
理解这些机制有助于优化程序性能和稳定性。
TODO...(用到在查吧。。)