程序执行是跑在内存中的,而程序中不同的对象(如 指针,局部变量,全局变量,函数参数 等等)要求的生命周期是不同的,所以将这些对象放在不同的区段,这样就赋予了这些对象不同的生命周期,内存四区由此而来。
内存四区分为:栈区,堆区,全局区,代码区。
栈区由编译器自动分配和释放。
栈区主要存放函数参数、函数返回值、局部变量。
堆区由程序员手动分配和释放。如果程序员未释放,在程序运行结束时,由系统释放。
堆区主要存放由 malloc 关键字申请的内存空间。在C++语言中关键字 new 申请的内存也在堆区。
全局区又叫数据区或者静态区。
全局区分为三段: data段 、bss段、rodata 段。
(1).data 段存放已初始化和值不为0的全局变量和静态变量
(2).bss 段存放未初始化和初始化值为0的全局变量和静态变量。
(3).rodata 段存放各类常量,如:const、字符串、#define等
data 段又叫 RW-data 段
bss 段又叫 ZI-data 段
rodata 段又叫常量区或只读存储区
代码区又叫 code 段 或 text 段。
用来存放程序代码,由操作系统进行管理,只读。
flash 或者 ROM 掉电后数据还是保存的,保存的数据有 RO-data、RW-data、代码区
RAM 一般指的就是 sdram,运行速度快,但是掉电数据会丢失,保存的数据有 栈区、堆区、数据区
注意:
1,flash 或者 ROM 中为什么不保存 ZI-data?
ZI-data 段数据未初始化或初始化为0,在启动系统时直接将这块 flash 或者 ROM 清0即可,无需保存。
2,RW-data 是 RAM 使用的,为什么存储到 flash 或 ROM 中?
RW-data 这部分变量已经初始化了,只存在RAM中掉电会丢失,所以需要在flash 或 ROM 中存储一份