13.内存位宽及编址寻址

来源:互联网 发布:js拖拽与放大 编辑:程序博客网 时间:2024/06/03 19:08

13.1.什么是内存
(1)从硬件角度:内存实际上是电脑上的一个配件,也叫内存条。根据不同的硬件实现原理可以把内存分成SRAM和DRAM。DRAM又有很多代,譬如最早的SDRAM,后来DDR1、DDR2…、LPDDR等。
(2)从逻辑角度:内存可以随机访问(俺们可以通过某个随机的内存地址就可直接访问该内存地址);并且可以对内存进行读写操作(在逻辑上也可设置其为只读或只写)。内存在编程中天然是用来存放变量的(正是因为有了内存,所以C语言才能定义变量,C语言中的一个变量实际就对应内存中的一个单元)。


13.2.内存的编程模型
(1)从逻辑角度来讲,内存实际上是由无限多个内存单元格组成的,每个单元格有一个固定的地址叫内存地址,该内存地址和该内存单元格唯一对应并且永久绑定。
(2)以大楼来类比内存:逻辑上的内存对应于一栋无限大的大楼;内存的单元格对应大楼中的一个个小房间;每个内存单元格的地址对应每个小房间的房间号;内存中存储的内容对应住在房间中的人。
(3)逻辑上来说,内存可以无限大(因为数学上编号永远可以增加,无尽头)。但现实中的内存大小是有限制的,譬如32位系统下可使用的最大内存就限制为4G。


13.3.位和字节及字和半字
(1)衡量内存单元的大小的单位:位(1bit)、字节(8bit)、半字(一般是16bit)、字(一般是32bit)。
(2)在所有的计算机、所有的机器中(不管是32位系统还是16位系统还是以后的64位系统),位永远都是1bit,字节永远都是8bit。
(3)历史上曾经出现过16位系统、32位系统、64位系统三种,而且操作系统还有windows、linux、iOS等很多,所以很多的概念在历史上曾经被混乱的定义过。
(4)建议对字、半字、双字这些概念不要详细区分,只要知道这些单位具体有多少位是依赖于平台的。实际工作中在每种平台上先去搞清楚这个平台的定义(字是多少位,半字永远是字的一半,双字永远是字的2倍大小)。
(5)编程时一般根本用不到字这个概念,那我们区分这个概念主要是因为有些文档中会用到这些概念,如果不加区别可能会造成你对程序的误解。在linux+ARM这个软硬件平台上,字是32位的。


13.4.内存位宽
(1)从硬件角度:硬件内存的实现本身是有宽度的,即有些内存条是8位的,而有些是16位的。两个内存芯片之间是可以并联的,通过并联后即使8位的内存芯片也可以做出来16位或32位的硬件内存。
(2)从逻辑角度:内存位宽在逻辑上可以是任意的位宽,甚至逻辑上存在内存位宽是24位的内存,但是实际上不存在这种硬件,也没有实际意义。从逻辑角度来讲内存位宽的大小对我的操作不构成影响,但是受限于硬件的特性,我们无法为所欲为。譬如24位的内存逻辑上和32位的内存没有任何区别,但实际硬件都是32位的,都要按照32位硬件的特性和限制来干活。


13.5.内存编址方法
(1)内存在逻辑上就是一个一个的格子,这些格子可以用来装东西(里面装的东西就是内存中存储的数);每个格子有一个编号,这个编号就是内存地址;这个内存地址(一个数字)和这个格子的空间(实质是一个空间)是一一对应且永久绑定的。这就是内存的编址方法。
(2)在程序运行时,CPU实际只认识内存地址,而不关心该内存地址所代表的空间在哪里及具体如何分布这些实体问题。因为硬件设计保证了按照这个地址就一定能找到对应的空间。
(3)所以说内存地址和内存空间是内存单元的两面性。


13.6.内存编址以字节为单位
(1)随便给一个数字(譬如说7),该数字是一个内存地址,那么该内存地址对应的空间大小就是一个字节(8bit)。
(2)如果把内存比喻位一栋大楼,那么这个楼里面的一个一个房间就是一个一个内存格子,这个格子的大小是固定的8bit,就好象这个大楼里面所有的房间户型是一样的。


13.7.内存和数据类型的关系
(1)数据类型是用来定义变量的,而这些变量需要存储、运算在内存中。所以数据类型必须和内存相匹配才能获得最好的性能,否则可能不工作或者效率低下。譬如说int整型,就是整数类型,这个整就体现在它和CPU本身的数据位宽是一样的,如32位的CPU,整型就是32位。
(2)在32位系统中定义变量最好用int,因为这样效率高。原因就在于32位的系统本身配合内存等也是32位,这样的硬件配置天生适合定义32位的int类型变量,效率最高。也能定义8位的char类型变量或者16位的short类型变量,但是实际上访问效率不高。
(3)在很多32位环境下,我们实际定义bool类型变量(只需要1个bit就够了)都是用int来实现bool的。也就是说我们定义一个bool 变量时,编译器实际帮我们分配了32位的内存来存储这个bool变量。编译器这么做实际上浪费了31位的内存,但是好处是效率高。
(4)实际编程时要以省内存为大还是要以运行效率为重?答案是不定的,看具体情况。很多年前内存很贵机器上内存都很少,那时候写代码以省内存为主。现在随着半导体技术的发展内存变得很便宜了,现在的机器都是高配,不在乎省一点内存,而效率和用户体验变成了关键。所以现在写程序大部分都是以效率为重。


13.8.内存对齐
(1)我们在C中int a;定义一个int类型变量,在内存中就必须分配4个字节来存储这个a。有这么2种不同内存分配思路和策略:
第一种:0 1 2 3 对齐访问
第二种:1 2 3 4 或者 2 3 4 5 或者 3 4 5 6 非对齐访问
(2)内存的对齐访问不是逻辑的问题,是硬件的问题。从硬件角度来说,32位的内存它的0 1 2 3四个单元本身逻辑上就有相关性,这4个字节组合起来当作一个int在硬件上就是合适的,效率就高。
(3)对齐访问很配合硬件,所以效率很高;非对齐访问因为和硬件本身不搭配,所以效率不高。因为兼容性的问题,一般硬件也都提供非对齐访问,但是效率要低很多。


0 0
原创粉丝点击