• 262.00 KB
  • 2022-04-29 14:19:30 发布

最新红楼梦林黛玉进贾府路线图课件PPT.ppt

  • 26页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'红楼梦林黛玉进贾府路线图 东角门荣国府贾赦院厢庑游廊厢庑游廊穿堂南大厅贾政院荣禧堂耳房厢房厢房抄手游廊厢房穿堂贾母前院五间上房穿堂夹道后廊贾母后院抱厦厅影壁凤姐屋北小正房东三间厅大插屏垂花门抄手游廊三层仪门西角门 第10章目标程序运行时的存储组织学习目标:掌握:参数传递的几种方式理解:静态存储分配、栈式动态存储分配、堆式动态存储分配的基本思想 10.1运行时的存储空间结构当程序运行时,存储区的内容包括:目标代码目标代码的大小在编译时可以静态确定,因此可以把它放在静态确定的区域;目标代码运行时的数据空间数据空间包括:用户定义的各种类型的数据对象;临时工作单元;输入/输出缓冲区等数据空间有三种组织形式:静态数据区、栈区和堆区 目标代码区静态数据区栈区堆区目标代码区(code);静态数据区(staticdata):用于存放编译时能确定所占用空间的数据,如全局变量和静态变量堆栈区(stackandheap):用于存放编译时不能确定所占用空间的数据,如可变数据以及管理过程活动的控制信息运行时的存储空间结构如下:自由空间 10.2运行时的存储空间分配影响分配策略的因素:源语言的结构特点源语言的数据类型源语言中决定名字作用域的规则编译器具体实现时,采用如下三种分配策略之一或三种的混合形式。这三种方式是:静态存储分配栈式动态存储分配堆式动态存储分配 10.2.1静态存储分配指在编译时对数据对象分配固定的存储位置,运行时始终不变。即一旦存储空间的某个位置分配给了某个数据名,则在目标程序的整个运行过程中,此位置(地址)就属于该数据名。由静态存储分配产生的数据区称为静态数据区。静态存储分配适用于不允许递归过程或递归调用,不允许可变体积的数据结构的语言静态存储分配的特点:简单、易于实现例:FORTRAN语言,它所有的数据都属于这一类。 例:FORTRAN程序主程序段ProgramCNSUME……子程序段CharacterfunctionPRDUCE()……PRDUCE的数据区CNSUME的数据区PRDUCE的目标代码CNSUME的目标代码代码区静态数据区 10.2.2动态存储分配指在运行阶段动态地为源程序中的数据对象分配存储位置实行动态存储分配的语言的特点:允许递归过程允许可变数据结构(可变数组或记录等)允许用户自由申请和释放空间这种程序在编译时无法确定运行时所需数据空间的大小,需待程序运行时动态确定有两种动态存储分配方式:栈式(stack)、堆式(heap)。 10.2.3栈式动态存储分配在数据空间中开辟一个栈区,每当调用一个过程时,它所需要的数据空间就分配在栈顶,每当过程工作结束时就释放这部分空间。空间的使用符合先借后还的原则。特点:先借后还,管理简单,空间使用效率高栈式动态存储分配适合于PASCAL、C等典型过程式语言。 Programmain;全局变量定义;ProcedureR;…End(R);ProcedureQ;…End(Q);主程序执行体End.(main)若主程序调用Q,Q递归调用自己,在Q第二次进入运行后的存储结构为:Q的数据区Q的数据区主程序全局数据区代码区栈区 10.2.4堆式动态存储分配在数据空间中开辟一片连续的存储区(通常叫做堆),每当需要时就从这片空间借用一块,不用时再退还。借用与归还未必服从“先借后还”的原则。堆式动态存储分配适合于用户可以自由申请和归还数据空间的语言,如C++。特点:适用范围广,容易出现碎片。如何充分利用空间是个难题。 作为存储分配组织的一个原则,能在编译时完成的存储分配尽量采用静态分配方案,避免目标程序中携带许多用于存储分配的指令,以提高目标代码的效率。 10.3参数传递过程(函数)是结构化程序设计的主要手段,同时也是节省程序代码和扩充语言能力的主要途径。当一个过程调用其他过程时,调用与被调用之间的通信或者通过全局量,或者由参数传递。掌握编译器使用的参数传递的方法很重要,它们直接影响程序运行的结果。 过程定义procedureSWAP(n,m:real);varj:real;beginj:=n;n:=m;m:=jend;参数传递的例子:主程序i:=5;k[i]:=6;SWAP(i,k[i]);过程调用… 1.参数参数过程定义中的参数称为形式参数,简称形参。过程调用中的参数称为实在参数,简称实参。实参可以是变量、常量或较复杂的表达式,应与相应的形参在性质上相容。参数传递常用的三种途径:传值(callbyvalue),也称值调用传地址(callbyreference),也称引用调用传名(callbyname),也称“换名” 2.传值将实参的值计算出来,然后把它传给被调过程传值的实现:1.在被调过程的数据空间中为每个形参开辟一个形式单元(用以存放相应的实参值)。2.调用过程计算实参的值,并将其值放在对应的形式单元中。3.被调用过程执行时,每当访问(引用或赋值)形参时都处理成对形式单元的直接访问。特点:对形式参数的任何运算不影响调用过程中的实参的值 例过程定义procedureSWAP(n,m:real);varj:real;beginj:=n;n:=m;m:=jend;主程序i:=5;k[i]:=6;SWAP(i,k[i]);过程调用过程调用时,有(假设i的地址为add_i)调用者数据区add_iadd_K[5]65执行了语句”j:=n;n:=m;m:=j”后调用者数据区add_iadd_K[5]65结果:i=5,k[5]=6不变,未交换被调用者数据区add_nadd_m65add_j被调用者数据区add_nadd_m556add_j 3.传地址将指向实参存储位置的指针传给被调用过程传地址的实现:1.在被调过程的数据空间中为每个形参开辟一个形式单元(用以存放相应实参的地址)。2.调用过程将实参的地址放在对应的形式单元中。若实参是一个表达式(包括常数),例如a+b或2,先对表达式求值,并将值存入某一位置,然后将该位置的地址放在形式单元中3.被调用过程执行时,每当访问(引用或赋值)形参时都处理成对形式单元的间接访问。特点:对形式参数的运算影响调用过程中的实参的值 例过程定义procedureSWAP(n,m:real);varj:real;beginj:=n;n:=m;m:=jend;主程序i:=5;k[i]:=6;SWAP(i,k[i]);过程调用过程调用时,有(假设i的地址为add_i)调用者数据区add_iadd_K[5]65执行了语句”j:=n;n:=m;m:=j”后调用者数据区add_iadd_K[5]56结果:i=6,k[5]=5正确交换被调用者数据区add_nadd_madd_k[5]add_iadd_j被调用者数据区add_nadd_m5add_k[5]add_iadd_j 4.传名过程调用的作用相当于把被调用段的过程体抄到调用出现的位置,但把其中形式参数名换成相应的实在参数名。传名的实现:1.在被调过程的数据空间中为每个形参开辟一个形式单元(用以存放相应实参子程序的入口地址)。2.为每个实参设置一个计算实参地址和值的子程序(称为参数子程序),并将其入口地址放在对应的形式单元中。3.被调用过程执行时,每当访问(引用或赋值)形参时就按实参子程序的入口地址调用相应的参数子程序计算出当时实参的值(供引用)或地址(供赋值)。 例过程定义procedureSWAP(n,m:real);varj:real;beginj:=n;n:=m;m:=jend;主程序i:=5;k[i]:=6;SWAP(i,k[i]);过程调用…传名的结果:相当于把SWAP(i,k[i])语句换成:j=i=5i=k[5]=6k[6]=j=5结果:i=6;k[6]=5;k[5]=6。i与k[6]作了交换。j:=i;i:=k[i];k[i]:=j; 本章小结:运行时内存的划分:代码区、静态数据区、栈、堆;存储分配策略:静态分配、堆分配、栈分配参数传递的实现:如何进行实参与行参的结合;如何在代码中实现对参数的正确存取。'