Compare commits

...

2 Commits

Author SHA1 Message Date
166d3a9de9 fix image link 2026-04-02 09:46:31 +08:00
75720adacd rename folders 2026-04-02 09:45:34 +08:00
12 changed files with 10 additions and 10 deletions

View File

@@ -23,7 +23,7 @@
在画图时,栈底通常画在上方。
在内存地址视角中,栈底对应较高地址,因此按地址从低到高展示时,栈底会出现在下方。
![栈结构示意图](/CSAPP/images/L07%20Stack%20Picture.png)
![栈结构示意图](/CMU-CSAPP/images/L07%20Stack%20Picture.png)
#### 表 1栈底在上高地址在上

View File

@@ -70,8 +70,8 @@ get_num: # 这是Debug配置下的编译结果因此略显冗长
概念如图所示:
![指针与数组概念辨析 内存图示](/CSAPP/images/L08%20Array%20&%20Pointer%201.png)
![指针与数组概念辨析 图例](/CSAPP/images/L08%20Array%20&%20Pointer%202.png)
![指针与数组概念辨析 内存图示](/CMU-CSAPP/images/L08%20Array%20&%20Pointer%201.png)
![指针与数组概念辨析 图例](/CMU-CSAPP/images/L08%20Array%20&%20Pointer%202.png)
#### 内存中的二维数组
@@ -88,7 +88,7 @@ get_num: # 这是Debug配置下的编译结果因此略显冗长
```
这个数组在内存中存储的顺序如图:
![二维数组在内存中的存储顺序](/CSAPP/images/L08%20Multi%20Demonsion%20Array%20Memory.png)
![二维数组在内存中的存储顺序](/CMU-CSAPP/images/L08%20Multi%20Demonsion%20Array%20Memory.png)
也可以以这样的方式理解那个二维数组:
@@ -148,7 +148,7 @@ get_num_from_2d_arr: # assume: arr -> %rdi, row -> %esi, col -> %edx
```
它也可以用get_num_from_2d_arr C语言函数来获取对应位置的数据但**在内存中的情况完全不同**。它的内存布局长这样:
![存有指向一维数组的指针的一维数组的内存布局](/CSAPP/images/L08%20Array%20Pointer%20Array%20Memory.png)
![存有指向一维数组的指针的一维数组的内存布局](/CMU-CSAPP/images/L08%20Array%20Pointer%20Array%20Memory.png)
## Structures 结构体
@@ -166,7 +166,7 @@ struct structExample
};
```
![结构体的内存布局](/CSAPP/images/L08%20Struct%20Example%20Memory%20Layout.png)
![结构体的内存布局](/CMU-CSAPP/images/L08%20Struct%20Example%20Memory%20Layout.png)
因此,对结构体的访问也很简单。编译器直接“按图索骥”,根据定义找到对应的偏移量就行了。
@@ -208,7 +208,7 @@ struct badStruct
};
```
![badStruct的内存布局](/CSAPP/images/L08%20Bad%20Struct%20Memory%20Layout.png)
![badStruct的内存布局](/CMU-CSAPP/images/L08%20Bad%20Struct%20Memory%20Layout.png)
它足足空出来了8个字节的空间没有使用这使得它的总大小达到了24字节。
如果我们稍稍改动一下排布顺序......
@@ -223,7 +223,7 @@ struct goodStruct
};
```
![goodStruct的内存布局](/CSAPP/images/L08%20Good%20Struct%20Memory%20Layout.png)
![goodStruct的内存布局](/CMU-CSAPP/images/L08%20Good%20Struct%20Memory%20Layout.png)
这样子我们只需要1个字节的填充。结构体的总大小也因此减少到了16字节。
通常来说,将结构体成员按照**从大到小**的顺序排列,可以最大程度地减少填充字节的数量。
@@ -255,13 +255,13 @@ add_doubles:
- ```addps```:对两个寄存器内的所有单精度浮点数进行加法运算
它们的图解如下图所示:
![addss和addps指令的图解](/CSAPP/images/L08%20ADDSS%20&%20ADDPS%20Diagram%20.png)
![addss和addps指令的图解](/CMU-CSAPP/images/L08%20ADDSS%20&%20ADDPS%20Diagram%20.png)
*这里使用了SSE的128位寄存器来演示```addss```和```addps```指令的功能。对于AVX的256位寄存器```addss```和```addps```指令的功能是一样的,只不过它们可以同时处理更多的浮点数。*
- ```addsd```:对两个寄存器内的第一个双精度浮点数进行加法运算
- ```addpd```:对两个寄存器内的所有双精度浮点数进行加法运算
![addsd指令的图解](/CSAPP/images/L08%20ADDSD%20Diagram.png)
![addsd指令的图解](/CMU-CSAPP/images/L08%20ADDSD%20Diagram.png)
有了前面```addss```和```addps```的图解,```addsd```就不难理解了。它们的区别在于处理的数据类型不同,```addss```和```addps```处理单精度浮点数,而```addsd```和```addpd```处理双精度浮点数。
与此类似,```addpd```指令可以同时处理两个寄存器内的所有双精度浮点数进行加法运算。对于AVX的256位寄存器```addpd```可以同时处理四个双精度浮点数进行加法运算。

View File

Before

Width:  |  Height:  |  Size: 178 KiB

After

Width:  |  Height:  |  Size: 178 KiB

View File

Before

Width:  |  Height:  |  Size: 99 KiB

After

Width:  |  Height:  |  Size: 99 KiB

View File

Before

Width:  |  Height:  |  Size: 176 KiB

After

Width:  |  Height:  |  Size: 176 KiB

View File

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 38 KiB

View File

Before

Width:  |  Height:  |  Size: 54 KiB

After

Width:  |  Height:  |  Size: 54 KiB

View File

Before

Width:  |  Height:  |  Size: 120 KiB

After

Width:  |  Height:  |  Size: 120 KiB

View File

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 19 KiB

View File

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 19 KiB

View File

Before

Width:  |  Height:  |  Size: 74 KiB

After

Width:  |  Height:  |  Size: 74 KiB

View File

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 17 KiB