fix image link
This commit is contained in:
@@ -23,7 +23,7 @@
|
|||||||
在画图时,栈底通常画在上方。
|
在画图时,栈底通常画在上方。
|
||||||
在内存地址视角中,栈底对应较高地址,因此按地址从低到高展示时,栈底会出现在下方。
|
在内存地址视角中,栈底对应较高地址,因此按地址从低到高展示时,栈底会出现在下方。
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
#### 表 1:栈底在上(高地址在上)
|
#### 表 1:栈底在上(高地址在上)
|
||||||
|
|
||||||
|
|||||||
@@ -70,8 +70,8 @@ get_num: # 这是Debug配置下的编译结果,因此略显冗长
|
|||||||
|
|
||||||
概念如图所示:
|
概念如图所示:
|
||||||
|
|
||||||

|

|
||||||

|

|
||||||
|
|
||||||
#### 内存中的二维数组
|
#### 内存中的二维数组
|
||||||
|
|
||||||
@@ -88,7 +88,7 @@ get_num: # 这是Debug配置下的编译结果,因此略显冗长
|
|||||||
```
|
```
|
||||||
|
|
||||||
这个数组在内存中存储的顺序如图:
|
这个数组在内存中存储的顺序如图:
|
||||||

|

|
||||||
|
|
||||||
也可以以这样的方式理解那个二维数组:
|
也可以以这样的方式理解那个二维数组:
|
||||||
|
|
||||||
@@ -148,7 +148,7 @@ get_num_from_2d_arr: # assume: arr -> %rdi, row -> %esi, col -> %edx
|
|||||||
```
|
```
|
||||||
|
|
||||||
它也可以用get_num_from_2d_arr C语言函数来获取对应位置的数据,但**在内存中的情况完全不同**。它的内存布局长这样:
|
它也可以用get_num_from_2d_arr C语言函数来获取对应位置的数据,但**在内存中的情况完全不同**。它的内存布局长这样:
|
||||||

|

|
||||||
|
|
||||||
## Structures 结构体
|
## Structures 结构体
|
||||||
|
|
||||||
@@ -166,7 +166,7 @@ struct structExample
|
|||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
因此,对结构体的访问也很简单。编译器直接“按图索骥”,根据定义找到对应的偏移量就行了。
|
因此,对结构体的访问也很简单。编译器直接“按图索骥”,根据定义找到对应的偏移量就行了。
|
||||||
|
|
||||||
@@ -208,7 +208,7 @@ struct badStruct
|
|||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||

|

|
||||||
它足足空出来了8个字节的空间没有使用!这使得它的总大小达到了24字节。
|
它足足空出来了8个字节的空间没有使用!这使得它的总大小达到了24字节。
|
||||||
|
|
||||||
如果我们稍稍改动一下排布顺序......
|
如果我们稍稍改动一下排布顺序......
|
||||||
@@ -223,7 +223,7 @@ struct goodStruct
|
|||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||

|

|
||||||
这样子,我们只需要1个字节的填充。结构体的总大小也因此减少到了16字节。
|
这样子,我们只需要1个字节的填充。结构体的总大小也因此减少到了16字节。
|
||||||
|
|
||||||
通常来说,将结构体成员按照**从大到小**的顺序排列,可以最大程度地减少填充字节的数量。
|
通常来说,将结构体成员按照**从大到小**的顺序排列,可以最大程度地减少填充字节的数量。
|
||||||
@@ -255,13 +255,13 @@ add_doubles:
|
|||||||
- ```addps```:对两个寄存器内的所有单精度浮点数进行加法运算
|
- ```addps```:对两个寄存器内的所有单精度浮点数进行加法运算
|
||||||
|
|
||||||
它们的图解如下图所示:
|
它们的图解如下图所示:
|
||||||

|

|
||||||
*这里使用了SSE的128位寄存器来演示```addss```和```addps```指令的功能。对于AVX的256位寄存器,```addss```和```addps```指令的功能是一样的,只不过它们可以同时处理更多的浮点数。*
|
*这里使用了SSE的128位寄存器来演示```addss```和```addps```指令的功能。对于AVX的256位寄存器,```addss```和```addps```指令的功能是一样的,只不过它们可以同时处理更多的浮点数。*
|
||||||
|
|
||||||
- ```addsd```:对两个寄存器内的第一个双精度浮点数进行加法运算
|
- ```addsd```:对两个寄存器内的第一个双精度浮点数进行加法运算
|
||||||
- ```addpd```:对两个寄存器内的所有双精度浮点数进行加法运算
|
- ```addpd```:对两个寄存器内的所有双精度浮点数进行加法运算
|
||||||
|
|
||||||

|

|
||||||
有了前面```addss```和```addps```的图解,```addsd```就不难理解了。它们的区别在于处理的数据类型不同,```addss```和```addps```处理单精度浮点数,而```addsd```和```addpd```处理双精度浮点数。
|
有了前面```addss```和```addps```的图解,```addsd```就不难理解了。它们的区别在于处理的数据类型不同,```addss```和```addps```处理单精度浮点数,而```addsd```和```addpd```处理双精度浮点数。
|
||||||
|
|
||||||
与此类似,```addpd```指令可以同时处理两个寄存器内的所有双精度浮点数进行加法运算。对于AVX的256位寄存器,```addpd```可以同时处理四个双精度浮点数进行加法运算。
|
与此类似,```addpd```指令可以同时处理两个寄存器内的所有双精度浮点数进行加法运算。对于AVX的256位寄存器,```addpd```可以同时处理四个双精度浮点数进行加法运算。
|
||||||
|
|||||||
Reference in New Issue
Block a user