内存的机制
内存好比一个物流仓库,仓库可以按要求存取货物,而内存则是按要求存取数据。那么内存是怎么存取数据的呢?现来认识内存的结构,简单的来说,内存是一种特殊的电子元件,我们这里叫内存IC,内存IC主要有电源,控制部分,地址输入部分,数据输入部分,数据存储单位。有了这几个部分,内存就能实现数据的存储和读出。
仓库是怎么运作的?
在学习内存怎么运作之前,我们先来看看现实的仓库是怎么存储货物的,首先货物到了仓库后,门卫检查后放行,才可以进行入库操作,仓库人员需要看一下货物属性是什么,比如是大东西,就分配一个大空间堆放,如果是小东西就应该找个小一点的空间堆放,根据货物属性决定好存放空间后,还要把货物按仓库地址存放到指定位置,为什么要给货物拉到指定地址呢?仓库那么大,就近找个货架放好不就完了?当然不能乱放,大型仓库的空间是非常大的,不按地址乱放会严重影响取货效率!你也不希望你买的快递在物流仓库里出库就花一天时间吧?所以仓库需要一套严格的地址分配流程,必须先给地址再按地址堆放,但是也有这样的特殊的情况,有的货物来仓库后,只是临时存放一下,这批货物可能马上要运走或者因为不合格要马上销毁,仓库人员特意为了一批临时货物制定地址,然后又按地址去堆放,反而影响其他正常货物存取效率,这时仓库又规定一套临时货物存取规则,专门用于这些临时货物,这样有了这些规则之后,仓库就可以高效运作了。所以仓库制定了很多规则,都是为了让货物存取效率最大化。
相比较而言内存又是怎么运作的?
刚刚说的仓库存取货物和内存存取数据非常相像,毕竟内存也是人设计的,目的也是为了提高存取数据效率,把数据想象成货物即可,内存通上电后开始运作,数据从硬盘那里运输过来,内存的控制部分,给内存发出入库信号(也就是给内存IC数据发出写入信号),于是内存IC就进入了写的状态了,数据像货物一样被一一从货车上卸下来逐个检查类型,内存要看下数据到底是一个字节的char类型啊,还是2个字节的short类型,或者又是3个字节的long类型等,类型不同分配的空间不一样,一个字节分配一个单元的存储的空间,确定好数据存放空间后,还得把数据按指定地址存放,内存IC有一排地址信号控制部分,对地址信号部分操作后,就把数据存放到了指定的地址处,这里我们可以看到,内存IC地址范围越大,存放的东西也就越多,最后CPU要数据的时候就方便多了,只要有相应的地址信号,就能把那部分的数据取出来,如果内存不按地址进行数据存储会怎样?这和仓库按地址堆放货物是一样,如果不这样,存取数据就会浪费很多时间,每次找一个数据都要从头到尾把所以数据都找一遍,总而言之就是为了提高内存运行效率。
这里可能有人又要问了,前面打比喻说仓库会有临时货物存取机制,内存是否也有临时数据存储机制呢?当然有,我们在程序的编写过程中也会有临时数据产生,这时在内存存取过程中采用栈和队列来处理这些临时数据,这两种方式都不需要对数据进行地址编号,存取都变得更加快捷了,其中栈用的是LIFO方式,这就好比仓库存放临时货物时,划定了一个临时堆货区,只要来了货物就往这个堆货区上面堆加货物,但取的时候必须先取上面的,这样就是先到的反而后取出,栈存取数据也是这个道理,这和我们日常排队反过来了,后到的反而优先,想想好像不公平的样子,别着急,这里还有队列方式存放临时数据,队列方式和我们日常排队一样,优先放入的数据,取的时候也能优先取出来。那么我们该如何往内存的临时数据区域堆放临时数据呢?又该如何取数据呢?在C语言中我们用Push(num)方式来往临时区域堆放数据,用Pop方式来取临时数据,队列的话用的EnQueue(num)来存数据,用DeQueue(num)来取数据,至于怎么使用临时数据,那可就是程序员的事了。
理解了以上这些,就不难理解为什么C语言定义变量要指定变量类型了,内存的物理存储范围就那么大,编写程序时当然要严谨的定义变量类型。再一个就是C语言的指针,学C语言时会遇到指针这个概念,直接从概念上学习入手非常抽象,现在理解了前面说的数据和地址的对应关系,指针也就没有那么复杂了,指针说简单点就是我们刚刚比喻的给数据存放时编的地址,有了地址,内存就能高效的存取数据了,这样能大大提高程序运转效率,对于仓管人员来说,掌握了货物的地址就能灵活的调配仓库里的货物,而对于程序员来说掌握了指针就能灵活的利用内存存储数据啦。