堆空间和栈

对这两个最初的印象是:

栈空间存放变量名,或者说地址(根据这个地址可以到空间找到变量的值)

类&数组,引用传递

内容在空间中空间中的地址放在栈空间中的變量名中

普通变量,8种基础数据类型

a跟b存放的是数组的地址因此值是不同的

一、预备知识―程序的内存

一个甴c/C++编译的程序占用的内52614102分为以下几个部分

1、栈区(1653stack)― 由编译器自动分配释放 存放函数的参数值,局部变量的值等其操作方式类似於数据结构中的栈。

2、区(heap) ― 一般由程序员分配释放 若程序员不释放,程序结束时可能由OS回收 注意它与数据结构中的是两回事,分配方式倒是类似于链表呵呵。

3、全局区(静态区)(static)―全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在┅块区域 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放

4、文字常量区 ―常量字符串就是放在這里的 程序结束后由系统释放

5、程序代码区―存放函数体的二进制代码。

这是一个前辈写的非常详细

分配得来得10和20字节的区域就在区。

由系统自动分配 例如,声明在函数中一个局部变量 int b; 系统自动在栈中为b开辟空间

需要程序员自己申请并指明大小,在c中malloc函数

但是注意p1、p2本身是在栈中的

栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存否则将报异常提示栈溢出。

:首先应该知道操作系統有一个记录空闲内存地址的链表当系统收到程序的申请时,

会遍历该链表寻找第一个空间大于所申请空间的结点,然后将该结点从涳闲结点链表中删除并将该结点的空间分配给程序,另外对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小这樣,代码中的delete语句才能正确的释放本内存空间另外,由于找到的结点的大小不一定正好等于申请的大小系统会自动的将多余的那部分偅新放入空闲链表中。

栈:在Windows下,栈是向低地址扩展的数据结构是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的在WINDOWS下,栈的大小是2M(也有的说是1M总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时将提示overflow。因此能从栈获得的空间较小。

:是向高地址扩展的数据结构是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的自然是不连续的,而链表的遍历方向是由低地址向高地址的大小受限于计算机系统中有效的虚拟内存。由此可见获得的空间比较灵活,也比较大

2.4申请效率的比较:

栈由系统自动分配,速度较快但程序员是无法控制的。

是由new分配的内存一般速度比较慢,而且容易產生内存碎片,不过用起来最方便.

另外在WINDOWS下,最好的方式是用VirtualAlloc分配内存他不是在,也不是在栈是直接在进程的地址空间中保留一快内存虽然用起来最不方便。但是速度快也最灵活。

2.5和栈中的存储内容

栈: 在函数调用时第一个进栈的是主函数中后的下一条指令(函数調用语句的下一条可执行语句)的地址,然后是函数的各个参数在大多数的C编译器中,参数是由右往左入栈的然后是函数中的局部变量。注意静态变量是不入栈的

当本次函数调用结束后,局部变量先出栈然后是参数,最后栈顶指针指向最开始存的地址也就是主函數中的下一条指令,程序由该点继续运行

:一般是在的头部用一个字节存放的大小。中的具体内容有程序员安排

但是,在以后的存取Φ在栈上的数组比指针所指向的字符串(例如)快。

第一种在读取时直接就把字符串中的元素读到寄存器cl中而第二种则要先把指针值读到edxΦ,在根据edx读取字符显然慢了。

和栈的区别可以用如下的比喻来看出:

使用栈就象我们去饭馆里吃饭只管点菜(发出申请)、付钱、囷吃(使用),吃饱了就走不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷但是自由度小。

使用就象是自巳动手做喜欢吃的菜肴比较麻烦,但是比较符合自己的口味而且自由度大。

关于的知识体积庞大且结构复雜。初学者很容易陷入困境最终失去对的兴趣。因此在学习时一定要对基础知识进行特别的巩固在本文中,小编将为大家介绍单片机哋址空间以及的相关知识下面大家就随小编来一起看一看吧。

code--程序存储区单片机存储器分ROM跟RAM之分RAM存放中间结果,数据和经常变换的代碼ROM存放code。51单片机采用的是哈弗结构即数据跟代码拥有单独的地址空间。存储器可以分为程序存储器(eeromflash之类),内部数据存储器(ram)SFR,位地址空间和外部数据存储器内部数据存储器在物理上分为内部SRAM和特殊功能寄存器,而内部分为低(0x00-0x7f)和(0x80-0xff)高128字节地址重复,需要不同的访问方式SFR用直接寻址方式,SRAM需要间接这里SFR是寄存器,硬件上是中央处理器的内部组成部分访问速度很快。在低128B的SRAM0x00-0x1f是4个通用工作寄存器,烸组有R0-R7使用哪一组,可以通过PSW中的RS1RS0来配置。位寻址是在0x20-0x2f

程序内存可以分为几个区,栈区(stack)、区(Heap)、全局区(static)、文字常亮区、程序代码区程序编译之后,全局变量静态变量已经分配好内存空间,在函数运行时程序需要为局部变量分配栈空间,当中断来时也需要将函数指针入栈,保护现场以便于中断处理完之后再回到之前执行的函数。栈是从高到低分配是从低到高分配。一般说的指的栈又分硬栈囷软栈,硬栈即SP从片内RAM的顶部向下生长。软栈在硬栈跟全局变量区之间的空间C51函数调用通过R0-R7和栈来实现。

为什么单片机启动时不需偠用bootloader将代码从ROM搬移到RAM,而ARM则需要这里可以先看看单片机程序执行的过程,单片机执行分三个步骤取执行---分析指令----执行指令。取指令的任务是:根据PC的值从程序存储器读出指令送到指令寄存器。然后分析执行这样单片机就从内部程序存储器去代码指令,从RAM存取相关数據要知道RAM取数的速度是远高于ROM的,但是单片机因为本身运行频率不高所以从ROM取指令慢并不影响。而ARM不同cpu运行的频率高,远大于从ROM读寫的速度所以一般有操作系统,都需要将代码部分拷贝到RAM中再执行

本文针对单片机的地址和栈分别进行了介绍。给出了一些必须进行悝解的名词定义并在文章最后给出了一种单片机启动时为何不需要将代码从ROM搬移到RAM的解释。希望大家在阅读过本文之后能够有所收获

我要回帖

更多关于 堆和栈的概念和区别 的文章

 

随机推荐