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语言中的存储的主要内容,如果未能解决你的问题,请参考以下文章

c语言中的静态存储变量是存储在哪里的,一般啥时候用

c语言中字符型数据在内存中的存储形式是?

C语言中函数是如何存储的

C语言,想在存储区的某个地址写上某个数值

C语言中结构体在内存中的存储方式?

C语言进阶——数据的存储