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

1.3.1内存编址方法

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

1.3.2关键:内存编址是以字节为单位的

我随便给一个数字(譬如说7),然后说这个数字是一个内存地址,然后问你这个内存地址对应的空间多大?这个大小是固定的,就是一个字节(8bit)。
如果把内存比喻为一栋大楼,那么这个楼里面的一个一个房间就是一个一个内存格子,这个格子的大小是固定的8bit,就好像这个大楼里面所有的房间户型是一样的。
一个地址天生的对应空间的长度就是一个字节而已;

1.3.3内存和数据类型的关系

C语言中的基本数据类型有:char, short, int, long, float, double
int 整型(整数类型,这个整就体现在它和CPU本身的数据位宽是一样的)譬如32位的CPU,整型就是32位,int就是32位。
数据类型和内存的关系就在于:
数据类型是用来定义变量的,而这些变量需要存储、运算在内存中,所以数据类型必须和内存相匹配才能获得最好的性能,否则可能不工作或者效率低下。
在32位系统中定义变量最好用int,因为这样效率高。原因就在于32位的系统本身配合内存的也是32位,这样的硬件配置天生适合定义32位的int类型变量,效率最高。也能定义8位的char类型变量或者16位的short类型变量,但是实际上访问效率不高。
在很多32位环境下,我们实际定义bool类型变量(实际只需要1个bit就够了)都是用int来实现bool的。也就是说我们定义一个bool b1时,编译器实际帮我们分配了32位的内存来存储这个bool变量b1,编译器这么做实际上浪费了31位的内存,但是好处是效率高。
问题:实际编程时要以省内存为大还是要以运行效率为重?答案是不定的,看具体情况。现在的机器都是高配,不在乎省一点内存,而效率和用户体验成了关键。所以现在程序大部分都是以效率为重。

1.3.4内存对齐

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

1.3.5从内存编址看数组的意义

数组其实就是从内存中截取了一部分而已,数组名a代表数组中首元素的首地址,那么何谓首地址呢?所谓首地址就是数组中的第一个元素共32位,一共有4个地址,因为int类型包含四个字节,每个字节有一个地址,那么a就代表第一个字节的地址。

  • 0
    点赞
  • 0
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

打赏
文章很值,打赏犒劳作者一下
相关推荐
©️2020 CSDN 皮肤主题: 我行我“速” 设计师:Amelia_0503 返回首页

打赏

非主流的豆瓣

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者