首页 > 代码库 > 内存编址、寻址、内存对齐
内存编址、寻址、内存对齐
朱老师物联网大讲堂学习笔记
1、内存编址方法
内存在逻辑上是一个个格子,格子占有空间,可以用来存储数据,每个格子有编号,编号就是内存的地址,地址和格子空间是一一对应且永久绑定的。程序运行时,CPU只关心地址,不关心这个地址所代表的空间在哪里,怎么分布这些实体问题。有地址就一定能够找到对应的内存单元(内存单元:包括内存地址和空间)。地址是固定的,空间中存储的东西是变动的,这和数组做左右值相关?
关键:内存编址以 字节 为单位。比如给定一个内存地址7,其对应的空间大小就是固定的8bit,是定死的。一定要记住,以后学习指针的时候很重要。就好比宾馆一样,房间号(地址)不同每个房间都是标准的大床房(所占单位空间都一样),没有双人间,都是标标准的大床房,面积都一样,至于里面住什么人,看存的是啥。
2、内存和数据类型的关系
c语言的数据类型有:char、short、int、long、float、double
int(整型,整数类型,整体现在它和CPU的数据位宽是一样的,如32位CPU,int就是32位,4byte)
二者关系:数据类型是用来定义变量的,而这些变量需要存储、运算、在内存中。所以数据类型必须和内存匹配,才能获得最好性能 ,否则可能不工作或者效率低下。
在32位系统中定义变量最好用int,因为这样效率高,32位的系统本身配合内存也是32位,这样的配置天生适合定义32位int变量(软硬结合理解),效率高,当然其他的类型也能定义,但是访问效率不高,比如定义8位的char,比32位的效率低。
在很多32位环境下,定义bool变量,实际只需要一个bit位,但我们定义时,都是用int来实现bool。例如:我们定义一个 bool b1; 时,编译器实际帮我们分配了32 位的内存来帮我们存储这个变量,虽然浪费了31位,但是效率高。 现在硬件便宜,偏向效率。其实,这要具体情况具体分析。
3、内存对齐
例如int:
图1这种是对齐访问,类似图2/3这种是非对齐访问,逻辑虽然相同,都是int,32bit,但是对存的对齐访问 不是逻辑问题,是硬件问题。
硬件角度讲:32bit的内存它 0 1 2 3 四个单元本身逻辑上就有相关性,这四个字节合起来当做一个int,硬件上就是合适的,效率就高,why?比如4人去出差,大家肯定希望在同一楼方便,如果隔了一层楼之类的,那肯定就是不方便了,虽然编号相连,但实际可能不相连,0 1 2 3 天生硬件就是连接的,而1 2 3 4就可能就不是相连的,效率就可能不高,但是一般硬件都是提供非对齐访问的,但实际效率不高,现在一般内存访问,有内存,有钱,不差那一点。
4、从内存编址看数组的意义
数组就是拿一段内存空间出来。完全可以和内存逻辑图类比理解,
int 类型数组 a。 首元素是a[0],包含4个元素 1 22 3 1,首地址是0,就是首元素那一串的第一个元素的地址0.
内存编址、寻址、内存对齐