您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 公司方案 > 9-运行时存储空间组织
第九章运行时存储空间组织程序的装入和链接内存Obj1Obj2Objn……linker可装载模块loaderFile1File2Filen……compiler程序的装入方式绝对装入方式可重定位装入方式动态运行时装入方式绝对装入方式20006000020006000可重定位装入方式010004000070003000Load3000Load6000动态运行时装入方式010004000070003000Load3000Load6000050001000Load3000装入时运行时参数传递形参、实参intfunc1(intm,intn){}func1(a,b);左值:表达式所表示的存储单元右值:这个存储单元所存储的值A=4+6四种参数传递方法传值传地址(引用调用)传结果(复制恢复)实参的右值传给被调用过程,控制返回时,形参的当前右值复制回实参的左值。传名(宏扩展)传值:procedurep(x,y,z);beginy:=y+2;z:=z+x;end;begina:=4;b:=5;p(a+b,a,a);printaendprinta的结果为4传地址:procedurep(x,y,z);beginy:=y+2;z:=z+x;end;begina:=4;b:=5;p(a+b,a,a);printaend594xyzcab615printa的结果为15传结果:procedurep(x,y,z);beginy:=y+2;z:=z+x;end;begina:=4;b:=5;p(a+b,a,a);printaend944594xyzcab613613printa的结果为13传名调用-callbyname过程被看作宏,原文替换procedureswap(varx,y:integer);vartemp:integer;begintemp:=x;x:=y;y:=tempend;Swap(i,a[i])temp:=i;i:=a[i];a[i]:=temp;传名:procedurep(x,y,z);beginy:=y+2;z:=z+x;end;begina:=4;b:=5;p(a+b,a,a);printaenda:=a+2;//6a:=a+(a+b);//17printa的结果为17存储分配策略静态存储分配在编译时对数据对象分配固定的存储单元,且在运行时保持不变.栈式动态存储分配运行时,每当调用一个过程,它所需的存储空间就动态地分配于栈顶,每当过程结束时就释放这部分空间.堆式动态存储分配允许用户自由申请和释放数据空间目标程序运行时存储区的典型划分codestaticdatastack↓↑heap数据区main{staticinti,k;intj;char*p,*p1;intm;p=newchar[0x20];p1=newchar[0x20];printf(“….”,&i,&k,&j,&p,&p1,&m,p,p1);}&i-0042359C&k-004235A0&j-0012FF7C&p-0012FF78&p1-0012FF74&m-0012FF70p-00431940p1-004318F0栈式存储分配的实现过程的活动记录AR(ActivationRecord)一段连续存储区,存放过程的一次执行所需动态信息临时工作单元局部变量机器状态信息存取链控制链实参返回地址简单的栈式存储分配的实现main调用QQ又调用了RR进入运行后的存储结构main全局数据区Q的活动记录R的活动记录main全局数据区R的活动记录main全局数据区Q的活动记录main调用Q,main接着调用R
本文标题:9-运行时存储空间组织
链接地址:https://www.777doc.com/doc-840623 .html