c语言中的存储
Posted 汽车软件
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言中的存储相关的知识,希望对你有一定的参考价值。
No.1
内存分区
内存分为堆、栈、自由存储区、全局/静态存储区和常量存储区5个区
1)栈
由编译器在需要的时候分时配,在不需要的时候进行清除的存储区,通常为局部变量、函数参数等。
2)堆
由应用程序控制的内存分配,可通过new、delete进行申请和释放内存,若未主动释放,则程序在结束时会自动进行内存的释放
3)自由存储区
由malloc、free等申请和释放的内存块
4)全局/静态存储区
全局变量和静态变量被分配到同一块内存中
5)常量存储区
这是一块特殊的存储区,里面用于存储常量,不允许修改
No.2
C语言程序的存储区域
在程序运行时会产生几个部分,各个部分代表不同的存储区域
1)代码段
代码段由程序执行的机器代码组成。在执行程序的过程中,CPU的程序计数器指向代码段的每一条机器代码,并由处理器依次执行
2)只读数据段
只读数据段是程序使用的一些不会被更改的数据,使用这些数据的方式类似查表式的操作。
3)已初始化读写数据段
在程序中声明,并且具有初值的变量,这些变量需要占用存储器空间。程序执行过程中他们需要位于可读写的内存区域,并且有初值,以供程序运行时读写。
4)未初始化数据段
在程序中声明,但是没有初始化的变量,这些变量在程序运行之前不需要占用存储器空间
5)堆
堆内存只在程序运行时出现。
6)栈
在函数内部使用的变量,函数的参数以及返回值将使用堆空间
代码段、只读数据段、读写数据段、未初始化数据段属于静态区域,而堆和栈属于动态区域。代码段、只读数据段和读写数据段将在链接之后产生。未初始化数据段在程序初始化的时候开辟,堆和栈将在程序执行过程中进行分配和回收
由const修饰的变量和程序中使用的常量将存储在只读数据区,全局变量、已经初始化的局部静态变量将存储在读写数据段
No.3
单片机C语言中的data, code
从数据存储类型来说,8051系列有片内、片外程序存储器,片内、片外数据存储器,片内程序存储器还分直接寻址区和间接寻址类型,分别对应code、data、xdata、idata以及根据51系列特点而设定的pdata类型,使用不同的存储器,将使程序执行效率不同,在编写C51程序时,最好指定变量的存储类型,这样将有利于提高程序执行效率。与ANSI-C稍有不同,它只分SAMLL、COMPACT、LARGE模式,各种不同的模式对应不同的实际硬件系统,也将有不同的编译结果。
在51系列中data,idata,xdata,pdata的区别:
data:固定指前面0x00-0x7f的128个RAM,可以用acc直接读写的,速度最快,生成的代码也最小。
idata:固定指前面0x00-0xff的256个RAM,其中前128和data的128完全相同,只是因为访问的方式不同。idata是用类似C中的指针方式访问的。
xdata:外部扩展RAM,一般指外部0x0000-0xffff空间,用DPTR访问。
单片机C语言unsigned char code table[]中code 是什么作用?
code的作用是告诉单片机,我定义的数据要放在ROM(程序存储区)里面,写入后就不能再更改,其实是相当与汇编里面的寻址MOVX(好像是),因为C语言中没办法详细描述存入的是ROM还是RAM(寄存器),所以在软件中添加了这一个语句起到代替汇编指令的作用,对应的还有data是存入RAM的意思。
程序可以简单的分为code(程序)区,和data (数据)区,code区在运行的时候是不可以更改的,data区放全局变量和临时变量,是要不断的改变的,cpu从code区读取指令,对data区的数据进行运算处理,因此code区存储在什么介质上并不重要,象以前的计算机程序存储在卡片上,code区也可以放在rom里面,也可以放在ram里面,也可以放在flash里面(但是运行速度要慢很多,主要读flash比读ram要费时间),因此一般的做法是要将程序放到flash里面,然后load到 ram里面运行的;DATA区就没有什么选择了,肯定要放在RAM里面,放到rom里面改动不了。
editor:Lixin Zhao
往期文章
以上是关于c语言中的存储的主要内容,如果未能解决你的问题,请参考以下文章