2024年10月11日 11:17

This commit is contained in:
许大仙 2024-10-11 03:17:20 +00:00
parent 6e29fcae27
commit 63e440e05e
4 changed files with 25 additions and 1 deletions

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 92 KiB

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 116 KiB

View File

@ -1290,6 +1290,26 @@ int main() {
#### 2.5.2.2 内存对齐
* 计算机的内存是以字节Bytes为单位进行划分的理论上 CPU 可以访问任意内存地址上的字节数据。但是,实际情况并非如此。
* CPU 是通过`地址总线`来访问内存的,一次能处理几个字节的时间,就命令地址总线读取几个字节的数据,如下所示:
![](./assets/12.jpg)
> [!NOTE]
>
> * ① 32 位的 CPU 一次可以处理 4 个字节的数据,那么每次就从内存读取 4 个字节的数据。
> * ② 64 位的 CPU 一次可以处理 8 个字节的数据,那么每次就从内存读取 8 个字节的数据。
* 以 `32` 位的 CPU 为例,实际寻址的步长是 `4` 个字节,也就是只对编号为 `4` 的倍数的内存进行寻址0、4、8、12 等,而不会对编号为 1、2、3、5 等的内存编号进行寻址,如下所示:
![](./assets/13.svg)
> [!NOTE]
>
> 好处:可以做到最快速度的寻址,既不会遗漏一个字节,也不会重复对一个字节进行寻址。
* 对于程序来说,一个变量最好在一个寻址步长范围内,这样就可以一次就读取到变量的值。如果要进行跨步长存储,那么就需要读取两次,然后再拼接数据,效率显而易见的降低。