c++程序的内存划分

资料:
https://blog.****.net/wu694128/article/details/88989846
https://blog.****.net/qq_41281601/article/details/82822904
https://www.cnblogs.com/smartjourneys/p/7487997.html
https://blog.****.net/blog_xu/article/details/86714673
https://blog.****.net/Emoeror_Zhang/article/details/94737249
https://blog.****.net/sinat_31039061/article/details/90183504

·本文介绍的是c/c++程序中的内存区是如何划分的,讲述了c++程序的一般情况,举了51单片机c程序的内存划分的例子.

一、总论
·内存顾名思义,内部存储器,本来是没有区别的,都是存储器而已。但是由不同的编译器编译出的程序会有不同的内存分区。c/c++程序是大类,单片机c程序属于c/c++大类,在c/c++程序的基础上进一步细化。
·了解单片机的内存物理划分以及代码和硬件操作的关系可以让工程师对程序的认识更上一层。学习一点基本的汇编可以加深理解。
单片机的内存划分可以从多个层次了解

二、c/c++程序的内存划分
c++程序的内存划分
  1、栈区(stack)—  由编译器自动分配释放 ,存放为运行函数而分配的局部变量、函数参数、返回数据、返回地址等。其操作方式类似于数据结构中的栈。存储运行程序过程中的中间数据。
  2、堆区(heap) —  一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。分配方式类似于链表。
  3、全局区(静态区)(static)—存放全局变量、静态数据、常量。程序结束后由系统释放。
  4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放。
  5、程序代码区—存放函数体(类成员函数和全局函数)的二进制代码。

三、51单片机程序划分
1、简单区分
RAM:
ROM:
·这个层面基本是硬件层面,51单片机由*处理器(cpu)、只读存储器(rom)、读写存储器(rom)、时钟电路、总线控制器、定时器、中断系统、串行口、并行io口组成。
·有的地方将二者成为程序存储器和数据存储器,但是并不是分别存储数据和程序。
2、具体区分
(1)片内RAM
c++程序的内存划分
(2)片外RAM
片外RAM的地址范围是0000H到FFFFH,容量即为64KB。对片外RAM读写,必须使用 MOVX 指令。
对片外RAM采用间接寻址方式,R0、R1和DPTR都可以做为间接寻址寄存器,R0、R1是8位的寄存器,即R0、R1的寻址范围最大为256个单元,而DPTR是16位地址指针,寻址范围就可达到64KB。
也就是说在寻址片外RAM时,寻址范围超过了256B,就不能用R0、R1做为间接寻址寄存器,而必须用DPTR寄存器做为间接寻址寄存器。

(3)ROM
ROM的地址范围是0000H到FFFFH,容量即为64KB,地址长度16位,作用是 存放程序及程序运行时所需的常数。
其中0000~0FFFH,即4K,在片内,其它在片外。
EA = 1,寻址内部ROM;EA = 0,寻址外部ROM
对ROM读出,必须使用 MOVC 指令

四、单片机与c++程序内存的对应关系
·没学过计算机系统,以下仅仅个人理解
1、二者对应
栈区:用于存储局部变量、中间参数等等过程量,存在于通用ram中。
堆区:由程序员控制的内存区,可以由程序员控制大小和释放内存。
全局区:存在于ram中,有全局变量和、静态变量。寄存器变量是由单片机自带的全局变量。
文字常量区:常量可读不可写,存在于rom中
程序代码区:程序同样是编译后不可改变的,所以存在于rom中。
2、内存分配有三种方法(资料中有详解)
·栈区和全局区属于静态存储区,编译后内存大小不会变化。堆区可以由程序进程进行改变和释放。