内存的管理艺术(基于C语言)2

来源:互联网 发布:淘宝网显示不正常 编辑:程序博客网 时间:2024/05/17 08:29

内存的管理艺术(基于C语言)2


                                                                      C语言--操作内存魅力的语言

本总结基于朱有鹏的C语言高级精讲篇

1、位、字节、半字,字的概念和内存位宽

(1)什么是内存?

 

硬件和逻辑两个角度:

 

从硬件的角度,内存实际上是电脑的一个配件,(一般有一个事件叫内存条)

根据不同的硬件实现的原理,还可以把内存分成SRAMDRAM

 

DRAM又有好多代,最早的SDRAM,后来的DDR1DDR2LPDDR(低功耗),手机用的。

静态的内存是不需要初始化就可以使用的,动态的内存需要初始化才可以使用。

 

从逻辑的角度来讲:

内存是这样的一种东西,他可以随机的访问(只要给一个地址,就可以访问这个内存地址)并且可以读写,

当然了逻辑上可以限制为只读和只写。内存在编程中天然是用来存放变量的。就是因为有了内存,所以C语言才可以定义变量。

C语言中的一个变量实际上就对应内存中的一个单元。


(2)内存的逻辑抽象图:(内存的编程模型)(这里不懂得话,说自己懂指针本身就是个笑话)

从逻辑的角度来讲:内存实际上是由无限多个内存单元组成的,每个单元格有一个固定的地址叫内存地址,

这个内存地址和这个内存单元格唯一的对应并且永久的绑定。内存的抽象图非常类似于房间。

以大楼来类比内存是最合适的,一块内存,逻辑上是一栋无限大的大楼,然后内存的单元格就好像大楼中的一个个的小房间,

每个内存单元格的地址就好像每个小房间的房间号,内存中存储的内容,就好像住在房间中的人一样。

逻辑上来说内存可以有无限大,因为数学大,编号可以增加,但是现实中实际的内存大小是有限制的,

比如32位的系统内存的限制就为4G。一般32位系统指的是32的数据线,但是一般的地址线也就是32位,

这个地址线32位决定了内存只能有32位二进制 ,232次方,内存的限制就是4G。实际上32位系统中

可用的内存一般是小于等于4G

 

硬件实现起来有些是比较简单有些是比较难的。

99%的情况都是32位的计算机。



2、内存单元大小的单位

(1)位和字节:

内存单元的大小单位有4个:位(1bit),字节(8bit),半字(一般16bit),字(一般32bit

在所有的计算机,所有的机器中(不管你是32位还是64位的操作系统)位永远都是1bit,字节永远是8bit

 

(2)字和半字:

    历史上曾经出现过32位,64位,16位,而且操作系统还有很多的操作系统,所以很多概念在历史上成曾经被混乱的定义过。

建议大家对字,半字,双字不要详细的区分,只要知道这些单元具体有多少位是依赖于平台的。实际工作中在每种平台上先去弄清楚这个平台的定义。

(字是多少位的,半字永远是字的一半,双字永远是字的2倍大小)

 

编程时一搬根本用不到字的概念,有些文档中会用到这些概念,如果不加区分可能对你对程序地误解。(朱老师)

在计算机中,一串数码作为一个整体来处理或运算的,称为一个计算机字,简称宇。字通常分为若干个字节(每个字节一般是8)

在存储器中,通常每个单元存储一个字,因此每个字都是可以寻址的。字的长度用位数来表示。

这里的解释对我后面理解内存对齐效率高非常有用。

linuxARM平台上这个软硬件平台上(我们的这个课程当中)

字是32位的


(3)内存位宽:

 

    从硬件的角度讲,硬件内存的实现本身是有宽度的,也就是说有些内存条就是8位的,而有些是16位的。

16位的内存最终接线出来的不一定是16位的,可以接成32位的。X210实际上用的是32位。我们默认是以32位系统来讲。

那么需要强调的是,内存芯片是可以并联的,即使是8位内存的芯片也可以做出来16位和32位的硬件内存。

    从逻辑角度来讲,内存位宽是任意的。24位的内存(但是实际上这种这种硬件是买不到的)

你的操作不是纯逻辑而是需要硬件去执行的,所以不能为所欲为,所以我们实际的操作很多都是受限于硬件的特性。

24位的内存和32位的内存是没有任何的区别的,但是实际上硬件都是32位的。都要按照32位的特性和限制来干活。



3、内存编址和寻址、内存对齐

(1)内存编址方法

每一个格子都会有一个地址,这些格子是可以用来装东西的,这里面装的东西就是内存中存储的数,每一个格子有一个编号,这个编号就是内存地址,这个内存地址(数字)和这个格子的空间(实质是一个空间),这两个东西是一一对应的,永久绑定的。

在程序运行时,CPU实际只认识内存地址,而不关心这个地址的所代表的空间在哪里,怎么分布这些实体的硬件问题。

因为硬件设计保证了按照这个地址就一定能找到这个格子,所以说内存单元的2个概念,地址和空间是内存单元的两面性。

 

 

(2)关键,内存编址是以字节为单位的

    地址为0的大小,的空间就是以字节为单位的。,这个内存地址对应的空间多大?

确定的是8bit。这个地址的地址就是一个字节。

如果把内存比喻为一栋大楼,那么楼里面的一个个房间就是固定的大小就是一个字节的大小,8bit的大小。

 

 

(3)内存和数据类型的关系

   当然指的是C语言的数据类型有:char  short  int  long  float  double   

这些数据类型跟占用的内存有关,int 整形(整数类型)

这个整就体现在他和CPU本身的数据位宽是一样的。

   比如32位的CPU,那么整形就是32位,那么int就是32位。

数据类型和内存的关系,我们用数据类型是定义变量的,而这些变量需要存储,运算在内存中。

所以说我们的数据类型必须和内存相匹配,否则可能不工作或者效率低下。

   在32位系统中定义变量最好用int,因为这样效率最高,原因就是32位的系统本身配合内存等也是32位,

这样的硬件配置天生适合定义32int的类型变量,也能定义8位的char类型或者16位的short类型变量,

但是实际上访问的效率不高。

在很多32位的环境下,我是实际上定义bool类型变量(实际上只需要1bit就够了)都是用int来代替bool的。

 

问题:实际编程时要以省内存为大,还是要以运行效率为重,答案是不定的,看具体情况?

很多年前内存很贵,那时候写代码以省内存为主。现在随着半导体技术的发展,内存变得很便宜了。

而效率和用户体验变成了关键。所以现在写程序大部分情况都是以效率为重。


(4)内存对齐

我们在Cint a,定义一个int变量,在内存中就必须分配4个字节来存储这个a,有这么2种不同内存分配思路和策略。

最好的使用内存的对齐的方式。

这种不是逻辑的问题,这种是硬件的关系。从硬件的角度来说,32位的内存它逻辑上就有相关性,这4个字节组合起来当作一个int,硬件就是合适的,效率就高。

有一种是一排的分配的方式    对齐访问

另一种是两排的分配的方式    非对齐访问

 

对齐访问很配合硬件 ,所以效率很高,所以效率很高,非对齐访问因为和硬件本身不搭配,所以效率不高(因为兼容性的问题,一般的硬件也提供非对齐访问,但是效率会低很多)

   是刚好匹配是最好的?

因为字的概念是:一次的计算机存取的数据的大小,还要加上一句的话,计算机的硬件是通过内存的对齐方式来存取的,如果你

执意要按照自己的书写方式,那么可以成功,但是计算机本来可以读取内容的话都分为好几次读取了。所以效率太慢。










原创粉丝点击