编程范式随课笔记(二)

来源:互联网 发布:第三方辅助软件 编辑:程序博客网 时间:2024/06/05 22:59

存储器构成

通过malloc/realloc分配的空间,会比实际指定的多4或8个字节(紧跟着返回的地址前)用来储存对malloc有用的信息,比如申请空间的大小信息。

int *arr = malloc(100*sizeof(int));free (arr+60);

free函数会机械的,从arr+60前的字节提取信息,然后删除。假如前面字节记录的数为265,那会将后面265个字节都释放。

堆内存管理器细节:因为自动分配的空间在堆中是零散的,那就会浪费很多空间,这时就希望能把空间尽可能的靠在一起,然后留下足够多且连续的空间给接下来要申请的空间。方法的话,可以将那些零散的空间搬运到一块,但是问题是返回的指针已经给了用户,这会导致错误,因此用另一种方法,从堆中分出一部分为the handle ,另一部分还是traditional heap manager,相当于返回给用户的指针离实际数据地址有两跳(没弄懂,那用户岂不是每次都要**才能取到值咯)。貌似这种压缩方法是mactonish7.0使用的。csapp里的合并策略跟这个不同,用的是边界标记技术。

栈(通常在高位地址中)

栈的活动程度跟里边函数的数量成正比。函数里面的局部变量都存在栈中,每次调用函数的时候,栈指针就会偏移函数所占空间大小的距离。

代码段


汇编代码

不同型号的汇编语言不同,课程里用的是自制的语言来帮助理解。但是在某些设计实现上应该采用的的同样的策略,下面就是讲这些策略。

特点,和上下文无关,每条指令独立执行,简单又高效。

汇编是怎么解决循环控制的呢,依靠一个特殊的寄存器PC(程序计数器),用来记录当前执行指令的地址。然后jmp指令能跳到指定的指令地址,然后接着顺序执行下去。

汇编语言的设计尽可能保证绝对正确,比如for循环能跳到前几个语句,以便少处理几个指令,但一旦这么设计了,整体的语言哲学就被破坏了,到最后可能lose control。

假如设计的汇编代码有59种操作类型,每条命令占32个字节,前6个字节记录的是操作码,硬件通过检查这个区域的值,来获取指令执行的类型。

寄存器和内存相连用于数据的交换,和算数逻辑单元(arithmetic logic unit)相连,进行一系列运算(指令集得以执行)

0 0