如果一个层次的符号结构看作一个记录的话,有分配符号表 和回收符号表的动作: 分配时动作: (1)TOP:=TOP+1;/分配存放原记录底的单元* (2)TOP*:=RB;将原记录底放入栈中* (3)RB: =TOP /RB指向新记录的底* (4)TOP:=TOP+n;鬥将栈指针指向分配后的栈顶* 回收时动作: (1)TOP:=RB-1;/恢复栈顶* (2)RB:=RB*;/*将保存的原记录底取出*
如果一个层次的符号结构看作一个记录的话,有分配符号表 和回收符号表的动作: 分配时动作: (1) TOP:=TOP+1;/*分配存放原记录底的单元*/ (2) TOP*:=RB; /*将原记录底放入栈中*/ (3) RB:=TOP; /*RB指向新记录的底*/ (4) TOP:=TOP+n; /*将栈指针指向分配后的栈顶*/ 回收时动作: (1) TOP:=RB-1;/*恢复栈顶*/ (2) RB:=RB*; /*将保存的原记录底取出*/
分配和收回示意图如下: TOP TOP TOP RB RB RB.SB一 SB SB
分配和收回示意图如下:
5.12堆 堆是一种非线性结构,它允许随机分配和回收实体。分 配请求返回的是指向所分配区域的指针,删除(回收)请求 需提供指向回收区域的指针。堆不提供任何访问被分配实体 的方式,它假设被分配实体的用户保留了指向分配区域的指 针 例:执行以下C程序后堆的状态如图所示: int ptr1, ptr 2, float* ptr 3 ptr1=(int*calloc(3, sizeof(int) ptr 2=(int *)calloc(2, sizeof(int) ptr 3=( float *)calloc(3, sizeof(float)) free(ptr2)
5.1.2 堆 堆是一种非线性结构,它允许随机分配和回收实体。分 配请求返回的是指向所分配区域的指针,删除(回收)请求 需提供指向回收区域的指针。堆不提供任何访问被分配实体 的方式,它假设被分配实体的用户保留了指向分配区域的指 针。 例:执行以下C程序后堆的状态如图所示: int * ptr1,* ptr2; float * ptr3; ptr1=(int *)calloc(3,sizeof(int)); ptr2=(int *)calloc(2,sizeof(int)); ptr3=(float *)calloc(3,sizeof(float)); free(ptr2);
head eth域 tr2 pt3匚·eth域了 eth域 enth
3个内存区在调用calc后被分配出去,指针ptr1,ptr2 ρtr3分别指向这些区域。fre释放了pt2指向的区域,这就产 生了一个“洞”。每个要被分配的区域都假设在分配前包含 length域。 在使用堆这种数据结构中,反复在堆中分配,释放会造成 不少空闲区(洞或碎片)。如何回收这些空闲区,进行合理 再分配,以提高内存的利用率是评判内存管理的标准。 要回收这些空闲区域,首先必须标明空闲区域,目前常用 的技术有引用计数和回收集两种。在引用计数技术中,系统 为每个内存区都关联一个引用计数器来指出引用的次数。当 新的用户访问该区域时,计数值增加,访问结束后减少。当 计数值为0时表明该区域为空闲。这种技术易于执行,但开 销会不断增大。回收集技术用两次扫描来辨别空闲区。第 次扫描所有已分配区的指针,标记那些已使用的内存区域; 第二次扫描标出所有未标记区,确认它们为空闲区。该技术 的开销不会逐渐增大
3个内存区在调用calloc后被分配出去,指针ptr1,ptr2, ptr3分别指向这些区域。free释放了ptr2指向的区域,这就产 生了一个“洞”。每个要被分配的区域都假设在分配前包含 length域。 在使用堆这种数据结构中,反复在堆中分配,释放会造成 不少空闲区(洞或碎片)。如何回收这些空闲区,进行合理 再分配,以提高内存的利用率是评判内存管理的标准。 要回收这些空闲区域,首先必须标明空闲区域,目前常用 的技术有引用计数和回收集两种。在引用计数技术中,系统 为每个内存区都关联一个引用计数器来指出引用的次数。当 新的用户访问该区域时,计数值增加,访问结束后减少。当 计数值为0时表明该区域为空闲。这种技术易于执行,但开 销会不断增大。回收集技术用两次扫描来辨别空闲区。第一 次扫描所有已分配区的指针,标记那些已使用的内存区域; 第二次扫描标出所有未标记区,确认它们为空闲区。该技术 的开销不会逐渐增大