CSAPP要点总结 第3章 程序的机器级表示 part5 汇编数组与异质的数据结构
改进此文档
07 Aug 2015
数组
数组与指针运算
这部分内容较为简单,所以不打算详细写出来。
大致而言,就是注意是:
- 地址还是地址指向的数组,以及取地址
leal
- 数据类型的长度,例如如果是int的4字节数组E[i],则是类似
(%edx,%ecx,4)
这类操作数,其中%edx
是基址,%ecx
是i。
嵌套的数组
即多维数组。
对于例如 int A[5][3]
,
等价于:
typedef int row3_t[3];
row3_t A[5];
看成一个5行3列的二维数组。C语言是行优先顺序,有些语言例如Fortran是列优先。
定长数组
C语言可以优化定长多维数组的代码。 简单来说,其基本原理是根据数组实际计算的规律,例如每次都是变动j,i不动 或者每次都是变动i, j不动之类的规律,来加入一个中间变量。 这样避免了每次都要从头计算数组地址。
这些优化编译器会自动完成。
变长数组
历史上,老版本的C基本上只支持定长数组。如果需要变长数组,不得不用malloc或者calloc,且不得不显示编码,用行索引将多维数组映射到一维数组。
到了ISO C99则引入了允许数组的维度是表达式,在数组分配时才计算出来。即变长数组。
异质的数据结构
-----EOF-----