内存四区及变量存放区域理解(这里写自定义目录标题)
存放区域
单片机内存分为RAM和FLASH,以STM32F103RBT6为例,具有128KB FLASH,20KB RAM.堆(Heap)、栈(Stack)和静态区都位于RAM内。
全局变量存储在静态区。
局部变量,以及形参,返回值等存储在栈中,由编译器自动分配和释放。
动态申请的内存,如malloc函数或new函数申请的存储与堆中。
程序代码下载存储在FLASH中,一些常量也存在这里。
const 修饰的变量存放位置
1.如果 const 修饰的是局部变量(例如在函数内部声明),那么这个变量通常存储在栈上。编译器可能会对其进行优化,例如直接将值内联到代码中,而不是真正分配栈空间。
2.如果全局 const 变量是 static 的(例如 static const int z = 30;),它的存储位置仍然是只读数据段,但它的作用域仅限于定义它的文件。
3.全局 static const 变量存储在只读数据段。
局部 static const 变量存储在全局数据段(因为 static 变量具有静态存储期)。
4.const 修饰的指针
const 修饰的指针的存储位置取决于指针本身的声明方式。
如果指针本身是 const(即指针的地址不可修改),但指向的数据不是 const,那么指针存储的位置与普通指针相同(例如栈或堆)。
如果指针指向的数据是 const,那么数据通常存储在只读数据段(如果是全局或静态变量)或栈/堆(如果是局部变量)。
- const 修饰的类成员变量
如果 const 修饰的是类的成员变量,那么这个变量必须在构造函数的初始化列表中初始化,并且它的存储位置取决于类的实例存储在哪里。
如果类对象是栈上的,则 const 成员变量也存储在栈上;如果类对象是堆上的,则 const 成员变量存储在堆上。
只读数据段通常存储在Flash区域,而非SRAM区域。
字符串字面量:存储在只读数据段。
SRAM和Flash的关系
1.工作原理:
SRAM:使用触发器电路存储数据,不需要刷新。
DRAM:使用电容器存储数据,需要定期刷新以保持数据有效。
Flash:使用浮栅技术存储数据,数据可以长期保持,不需要刷新。
2.速度和访问延迟:
SRAM:速度快,访问时间短。
DRAM:速度相对较慢,访问时间长,因为需要定期刷新。
Flash:速度较快,但通常比不上SRAM,也比不上DRAM。
3.易失性:
SRAM:非易失性,不需要刷新,但在断电时会丢失数据。
DRAM:易失性,需要定期刷新以保持数据有效。
Flash:非易失性,数据在断电时不会丢失。
4.应用场景:
SRAM:主要用于高性能缓存和嵌入式系统,如CPU缓存。
DRAM:用作计算机的主内存,提供大容量的临时存储。
Flash:用于长期存储数据,如固态硬盘、USB 随身碟等。
联系:
存储功能:SRAM、DRAM和Flash 存储器都用于存储数据,但在容量、速度和稳定性等方面有所不同,因此适用于不同的应用场景。
电子设备:SRAM、DRAM和Flash 存储器都是计算机和电子设备中常见的存储器类型,在不同的设备和系统中发挥着重要的作用。
存储层次结构:SRAM 通常用于高速缓存,DRAM 用作主内存,而 Flash 存储器用于长期存储。
内存四区
±---------------------+ 高地址
| 栈(Stack) | ↓ 向下增长
±---------------------+
| |
| 空区域 |
| |
±---------------------+
| 堆(Heap) | ↑ 向上增长
±---------------------+
| 未初始化数据区(BSS)|
±---------------------+
| 已初始化数据区 |
±---------------------+
| 代码段 |
±---------------------+ 低地址