《第九章符号表(精品).ppt》由会员分享,可在线阅读,更多相关《第九章符号表(精品).ppt(55页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第九章 符号表9.1符号表的作用和地位符号表的作用和地位9.2符号的主要属性及作用符号的主要属性及作用9.3符号表的组织符号表的组织9.4符号表的管理符号表的管理9.1 符号表的作用和地位符号表的作用和地位1.收集符号属性收集符号属性如如:int A;float B5;2.上下文语义的合法性检查的依据上下文语义的合法性检查的依据3.作为目标代码生成阶段地址分配的依据作为目标代码生成阶段地址分配的依据根据其被定义的存储类别或被定义的位置根据其被定义的存储类别或被定义的位置,确定其被分确定其被分配的区域和在区域中所处的具体位置配的区域和在区域中所处的具体位置.9.2 符号的主要属性及作用符号的主要
2、属性及作用语言符号语言符号:关键字、操作符号、标识符号关键字、操作符号、标识符号1、符号名、符号名2、符号的类型、符号的类型 决定其存储格式及可施加的运算操作决定其存储格式及可施加的运算操作如:整形用定点表示,实型用浮点表示如:整形用定点表示,实型用浮点表示又如:又如:a+b 检查类型,转换类型检查类型,转换类型3、符号的存储类别、符号的存储类别 存储类型定义:存储类型定义:1)用关键字指出;)用关键字指出;2)根据变量说明在程序中的位置决定)根据变量说明在程序中的位置决定4、符号的作用域及可视性、符号的作用域及可视性变量可视性的影响因素:变量可视性的影响因素:1)函数的形式参数)函数的形式参
3、数2)分程序结构)分程序结构5、符号变量的存储分配信息(存储区及在该区的具体位置)、符号变量的存储分配信息(存储区及在该区的具体位置)1)静态存储区)静态存储区公共静态区、局部静态区公共静态区、局部静态区静态变量的生存周期是程序运行的全过程。静态变量的生存周期是程序运行的全过程。2)动态存储区)动态存储区如:如:int a;float b;struct ccint d;float e;c;标识符标识符位置属性位置属性a0b4d0e4c86、符号的其它属性、符号的其它属性(1)数组内情向量表)数组内情向量表(2)记录结构型的成员信息)记录结构型的成员信息(3)函数及过程的形参)函数及过程的形参9
4、.3符号表的组织符号表的组织1、符号表的总体组织、符号表的总体组织1)按照属性完全相同的那些符号组织在一起。)按照属性完全相同的那些符号组织在一起。第一类符号属性1属性2属性3第二类符号属性1属性2属性4第三类符号属性2属性5属性6符号属性值1属性值2属性值3符号属性值1属性值2属性值4符号属性值1属性值5属性值62)把所有语言中的符号都组织在一张符号表中。)把所有语言中的符号都组织在一张符号表中。3)折衷的方式:根据符号属性相似程序分类组织成若干)折衷的方式:根据符号属性相似程序分类组织成若干张表,第张表记录的符号都有比较多的相同属性。张表,第张表记录的符号都有比较多的相同属性。符号属性值1
5、属性值2属性值3属性值4属性值5属性值6符号属性值1属性值2属性值3属性值4符号属性值2属性值5属性值62、符号表项的排列、符号表项的排列1)线性法(符号个数小于)线性法(符号个数小于20时采用较佳)时采用较佳)按符号被扫描到的先后顺序建立按符号被扫描到的先后顺序建立abdc符号 属性hp线性表2)排序组织及二分法)排序组织及二分法abdc符号 属性hp排序表3)散列组织)散列组织关键:杂凑函数的选取关键:杂凑函数的选取问题:散列冲突问题:散列冲突解决方法:多次散列解决方法:多次散列3、关键字域的组织、关键字域的组织1)等长关键字段符号表)等长关键字段符号表2)关键字池)关键字池如:有一组标识
6、符如:有一组标识符anexemplarofkey-wordsfield03121525关键字段 属性信息符号表anexem p laro fkey-w o rd sfield 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 304、其它域的组织、其它域的组织1)等长属性值域组织)等长属性值域组织如:可用如:可用1个个BIT位或位或1个布尔量来表示个布尔量来表示“定义否定义否”又如:表示符号的类型用又如:表示符号的类型用3个个BIT位或位或一个整型量一个整型量 data-type 3个
7、个bit位位char0 0 0short0 0 1int0 1 0long0 1 1unsigned1 0 0float1 0 1double1 1 0 对于一些表示符号之间关系的属性,可用指针对于一些表示符号之间关系的属性,可用指针(链链):如:函数如:函数-形参形参 结构结构-成员成员例:例:func1(para1,para2,para3)func2()func1Para1Para2Para3“null”func2“null”符号符号 函数函数-形参域形参域Struct tag1memb1 memb2struct tag2memb3 memb4 memb5memb6 memb7stv;Ta
8、g1memb1memb2tag2memb3memb4memb5“null”memb6memb7“null”stv符号符号 结构定义结构定义 结构结构-成员域成员域2)不等长属性值域的组织不等长属性值域的组织如:数组的内情向量表如:数组的内情向量表例:例:array1(subscrip1,subscrip2)array2(subscrip3,subscrip4,subscrip5,subscrip6)Array1Array2Subscrip1Subscrip20Subscrip3Subscrip4Subscrip5Subscrip60符号 内情向量指针域C语言中数组的相关组织:语言中数组的相关组
9、织:Int abc342;abcabc0abc1abc2abc00abc01abc02abc03abc10abc11abc12abc13abc20abc21abc22abc23abc000abc001abc010abc0115、下推链域的组织、下推链域的组织如:分程序中同名标识符生存期发生重叠如:分程序中同名标识符生存期发生重叠例:例:int i;.(1)func().(2)float i;.(3).(4)int i5;(5)(6)int i;.(7)i.(8)i.(9)_ int3内情向量 下推符号 指针 型 层数 指针符号表项符号表项_int0_float1int259.4 符号表的管理符
10、号表的管理1、初始化初始化1)表长是渐增变化的情况)表长是渐增变化的情况2)表长是确定的情况)表长是确定的情况2、符号表的登录、符号表的登录3、符号表查找、符号表查找4、分程序结构层次的管理、分程序结构层次的管理1)分表结构)分表结构2)单表结构)单表结构第十章第十章 目标程序运行时存储组织目标程序运行时存储组织10.1 数据空间的三种不同使用方法和管理方法数据空间的三种不同使用方法和管理方法10.2 栈式存储分配的实现栈式存储分配的实现10.3 参数传递参数传递10.4 过程调用、过程进入和过程返回过程调用、过程进入和过程返回10.5 堆式存储概述堆式存储概述数据空间数据空间运行时存储区域运
11、行时存储区域存储分配策略的依据:源语言的结构特点、源语存储分配策略的依据:源语言的结构特点、源语言的数据类型、源语言中决定名字作用域的规言的数据类型、源语言中决定名字作用域的规则等因素则等因素用户定义的各种类型的数据对象(变量和常量)用户定义的各种类型的数据对象(变量和常量)保留中间结果和传递参数的临时工作单元保留中间结果和传递参数的临时工作单元调用过程时所需的连接单元调用过程时所需的连接单元输入输入/输出所需的缓冲区输出所需的缓冲区目标区目标区静态数据区静态数据区栈区栈区堆区堆区codeStatic datastackheap10.1 数据空间的三种不同使用方法和管理方法数据空间的三种不同使
12、用方法和管理方法1、静态存储分配静态存储分配在编译时能确定目标程序运行时所需的全部数据空间的在编译时能确定目标程序运行时所需的全部数据空间的大小,编译时安排好目标程序运行时的全部数据空间,大小,编译时安排好目标程序运行时的全部数据空间,确定每个数据对象的存储位置。确定每个数据对象的存储位置。适合静态存储分配的语言(如:适合静态存储分配的语言(如:FORTRAN)特点:特点:不允许递归调用;不允许递归调用;不允许不同段间存储单元的互相引用、赋值;不允许不同段间存储单元的互相引用、赋值;不允许可变数组;不允许可变数组;所有数据名的性质完全确定;所有数据名的性质完全确定;2、动态存储分配、动态存储分
13、配特点:允许递归过程、可变数组或可变数结构特点:允许递归过程、可变数组或可变数结构1)栈式动态存储分配(先申请后释放,后申请先释放)栈式动态存储分配(先申请后释放,后申请先释放)过程所需数据空间:过程所需数据空间:(1)生存期在本过程这次活动中的数据对象,如局部变)生存期在本过程这次活动中的数据对象,如局部变量、参数单元、临时变量等。量、参数单元、临时变量等。(2)用以管理过程活动的记录信息)用以管理过程活动的记录信息2)堆式动态存储分配)堆式动态存储分配提供用户自由申请和退还数据空间的机制提供用户自由申请和退还数据空间的机制空闲块的分配策略空闲块的分配策略10.2 栈式存储分配的实现栈式存储
14、分配的实现活动记录活动记录:过程的活动记录是一段连续的存储区过程的活动记录是一段连续的存储区,用以存用以存放过程的一次执行所需要的信息放过程的一次执行所需要的信息,如如:1)临时工作单元临时工作单元 2)局部变量局部变量 3)保存机器状态保存机器状态 4)存取链存取链 5)控制链控制链 6)实参实参(形式单元形式单元)7)返回地址返回地址临时工作单元局部变量机器状态信息存取链控制链实参返回地址1、简单的栈式存储分配的实现、简单的栈式存储分配的实现要求:没有分程序结构,过程定义不嵌套,允许过程递要求:没有分程序结构,过程定义不嵌套,允许过程递归调用。归调用。例:例:Program main;全局
15、变量或数组的说明;全局变量或数组的说明;Proc R;End(R);Proc Q;End(Q);主程序执行语句主程序执行语句End.(main)R的活动记录Q的活动记录主程序全局数据区TOPSPQ的活动记录Q的活动记录主程序全局数据区Q的活动记录主程序全局数据区R的活动记录主程序全局数据区SP:指向现行过程活动记录的起点;指向现行过程活动记录的起点;TOP:始终指向已占用的栈顶单元;始终指向已占用的栈顶单元;分配了数组区之后的运行栈分配了数组区之后的运行栈临时工作单元临时工作单元局部数组的内情向量局部数组的内情向量局部简单变量局部简单变量实实参(形式单元)参(形式单元)参数个数参数个数返回地址
16、返回地址控制链(老控制链(老SP)TOPSP无嵌套无嵌套定义的过程活动记录内容定义的过程活动记录内容R的数组区R的活动记录Q的活动记录主程序全局数据区TOPSP2、嵌套过程语言的栈式实现、嵌套过程语言的栈式实现1)特点:允许过程嵌套定义)特点:允许过程嵌套定义(以(以PASCAL 为例)为例)Program sort(input,output);var a:array1.10 of integer;x:integer;procedure readarray;var I:integer;begin a endreadarray;procedure exchange(I,j:integer);be
17、gin x:=ai;ai:=aj;aj:=x endexchange;procedure quicksort(m,n:integer);var k,v:integer;function partition(y,z:integer):integer;var I,j:integer;begin a v exchange(I,j);endpartition;begin endquicksort;begin endsort.嵌套定义情况:嵌套定义情况:Sort readarray exchange quicksort partition2)允许过程嵌套定义带出的新要求:内层过程可以引用)允许过程嵌套定
18、义带出的新要求:内层过程可以引用外层过程定义的一些局部变量。外层过程定义的一些局部变量。解决方法:解决方法:(1)增设一个存取链;)增设一个存取链;(2)建立嵌套层次显示表,用以显示自内到外每一层过)建立嵌套层次显示表,用以显示自内到外每一层过程的最新活动记录的起始地址。程的最新活动记录的起始地址。3)增设存取链的方法:)增设存取链的方法:如:对上例,设某次执行顺序为:如:对上例,设某次执行顺序为:sortquicksort quicksort partition exchange存取链存取链控制链控制链局部变量局部变量i,j存取链存取链控制链控制链局部变量局部变量k,v存取链存取链控制链控制
19、链局部变量局部变量k,v存取链存取链控制链控制链变量变量a,xTOPSPExchange的活动记的活动记录录partition的活动记录的活动记录quicksort的活动记录的活动记录quicksort的活动记录的活动记录sort的活动记录的活动记录说明在说明在partition中中引用引用a的的过程过程4)建立嵌套层次显示表)建立嵌套层次显示表display的方法:的方法:(1)示例)示例如:上例中,若有以下四种调用情况:如:上例中,若有以下四种调用情况:quicksort的活动记录的活动记录sort的的活动记录活动记录TOPSPdisplayd1d0a)sortquicksortquick
20、sort的活动记录的活动记录quicksort的活动记录的活动记录sort的的活动记录活动记录TOPSPdisplayd1d0b)sortquicksort quicksort c)sortquicksort quicksort partition partition的活动记录的活动记录quicksort的活动记录的活动记录quicksort的活动记录的活动记录sort的的活动记录活动记录TOPSPdisplayd2d1d0d)sortquicksort quicksort partition exchange exchange的活动记录的活动记录partition的活动记录的活动记录quic
21、ksort的活动记录的活动记录quicksort的活动记录的活动记录sort的的活动记录活动记录TOPSPdisplayd2d1d0(2)display作为活动记录的一部分:作为活动记录的一部分:临时变量临时变量内情向量内情向量简单变量简单变量Display形式单元形式单元参数个数参数个数全局全局DISPLAY返回地址返回地址老老SPTOPSPd3210 d个单元个单元(3)运行中如何建立)运行中如何建立display表表 设一过程设一过程P1调用调用P2,则调用情况有如下两种:则调用情况有如下两种:P1 P2call P2P0P2P1 call P23、分程序结构的存储管理、分程序结构的存储
22、管理特点:允许含有分程序,分程序含有它自己的局部数据特点:允许含有分程序,分程序含有它自己的局部数据声明。如:声明。如:C语言。语言。分程序中的声明的作用域遵循最近嵌套原则:分程序中的声明的作用域遵循最近嵌套原则:1)一个分程序)一个分程序B中的一个声明的作用域包含在中的一个声明的作用域包含在B中。中。2)如果某个名字)如果某个名字X未在分程序未在分程序B中声明。那么,若中声明。那么,若B中出中出现的现的X的的声明的作用域是在声明的作用域是在B的包含层的包含层B中,则应该中,则应该(1)B中有中有X的声明,(的声明,(2)B与任何别的包含有与任何别的包含有X声声明的分程序相比,它是最近包围明的
23、分程序相比,它是最近包围B的分程序。的分程序。例:例:Main()int a=0;int b=0;int b=1;int a=2;printf(“%d%dn”,a,b);int b=3;printf(“%d%dn”,a,b);printf(“%d%dn”,a,b);printf(“%d%dn”,a,b);B0B1B2B3 声明声明作用域作用域int a=0;B0-B2int b=0;B0-B1int b=1;B1-B3int a=2;B2int b=3;B31)分程序结构的存储分配方法:分程序结构的存储分配方法:(1)把分程序看成一个把分程序看成一个“无参过程无参过程”。缺陷:缺陷:分程序不存
24、在被调用问题,所以不必把连接数分程序不存在被调用问题,所以不必把连接数据和据和DISPLAY放在活动记录中;放在活动记录中;多层分程序退出时(如从第多层分程序退出时(如从第5层层第第1层分程序,需要层分程序,需要重新找第一层时的重新找第一层时的TOP值)层层退出,费时。值)层层退出,费时。(2)每次为一个完整的过程体分配存储,即把一个过程每次为一个完整的过程体分配存储,即把一个过程体中的所有分程序所需的存储一次分配好。体中的所有分程序所需的存储一次分配好。解决:解决:不把分程序看作不把分程序看作“无参过程无参过程”,而让每个分程,而让每个分程序享用包围它的那个最小过程的序享用包围它的那个最小过
25、程的DISPLAY;代替原来的那个统一的栈顶指示器,让每个过程和分代替原来的那个统一的栈顶指示器,让每个过程和分程序都有自己的栈顶指示器程序都有自己的栈顶指示器TOP,它的值保存在各自它的值保存在各自的活动记录中;的活动记录中;2)分程序结构中过程的活动记录:)分程序结构中过程的活动记录:(1)过程的过程的TOP单元,指向活动记录的栈顶位置。单元,指向活动记录的栈顶位置。(2)连接数据,共连接数据,共4项:项:老老SP值;值;返回地址;返回地址;全局全局DISPLAY地址;地址;调用时的栈顶单元地址,称作老调用时的栈顶单元地址,称作老TOP。(3)参数个数和形式单元。参数个数和形式单元。(4)
26、DISPLAY表。表。(5)过程所管辖的各分程序的局部数据单元对每个分程序来说,包括:过程所管辖的各分程序的局部数据单元对每个分程序来说,包括:一个名为一个名为TOP的单元,当进入时它含现行栈顶地址,以后用来存的单元,当进入时它含现行栈顶地址,以后用来存放栈的新高度;放栈的新高度;分分程序的局部变量、数组内情向量和临时工作单元。程序的局部变量、数组内情向量和临时工作单元。例:例:Procedure A(m,n);integer m,n;B1:begin real z;array Bm:n;B2:begin real d,e;L3:end;B4:begin array C1:m;B5:begin
27、 real e;L6:end;end;L8:end;变量变量e变量变量e和和dB5的的TOP数组数组C的内情向量的内情向量B4的的TOPB2的的TOP数组数组B的内情向量的内情向量变量变量zB1的的TOPDisplay形式单元形式单元 m,n参数个数:参数个数:2调用时的栈顶地址(老调用时的栈顶地址(老TOP)全局全局DISPLAY地址地址返回地址返回地址老老SP过程的过程的TOP,指向活动记录之顶指向活动记录之顶过程过程A的活动记录的活动记录SPkd6543210分程序结构数据区变化图:分程序结构数据区变化图:B的内情的内情向量向量zB1的的TOPdisplay形式单元形式单元m,n 2连接
28、数据连接数据A的的TOPdisplay形式单元形式单元m,n 2连接数据连接数据A的的TOP数组数组BB的内情的内情向量向量zB1的的TOPdisplay形式单元形式单元m,n 2连接数据连接数据A的的TOP(a)到达标号到达标号B1处处(b)进入分程序进入分程序B1;(c)数组数组B分配之后分配之后数组数组B e dB2的的TOPB的内情向的内情向量量zB1的的TOPdisplay形式单元形式单元m,n 2连接数据连接数据A的的TOP数组数组C数组数组B C的内情向的内情向量量B4的的TOPB的内情向的内情向量量zB1的的TOPdisplay形式单元形式单元m,n 2连接数据连接数据A的的T
29、OP数组数组C数组数组BeB5的的TOPC的内情向的内情向量量B2的的TOPB的内情向的内情向量量zB1的的TOPdisplay形式单元形式单元m,n 2连接数据连接数据A的的TOP(d)进入分程序进入分程序B2(e)进入分程序进入分程序B4分配数组分配数组C之后之后(f)进入分程序进入分程序B510.3 参数传递参数传递左值和右值:左值和右值:ai:=aj1、传值、传值1)形式参数当作过程的局部变量处理,形式参数当作过程的局部变量处理,2)调用过程计算实参的值,并将它们的右值放在为形式调用过程计算实参的值,并将它们的右值放在为形式单元开辟的空间中;单元开辟的空间中;3)被调用过程执行时,就像
30、使用局部变量一样使用这些被调用过程执行时,就像使用局部变量一样使用这些形式单元。形式单元。传值的重要特点:对形式参数的任何运算不影响调用过传值的重要特点:对形式参数的任何运算不影响调用过程的活动记录中实参的值。程的活动记录中实参的值。实参实参形参形参左左值值右值右值2、传地址、传地址1)如实参是一个名字或是具有左值的表达式如实参是一个名字或是具有左值的表达式,则左值本身则左值本身传递过去传递过去.2)如实参是一表达式如实参是一表达式,没有左值没有左值,则表达式先求值则表达式先求值,并存入并存入某一位置某一位置,然后该位置的地址传递过去然后该位置的地址传递过去.3)被调过程中对形式参数的任何引用
31、和赋值都通过传递被调过程中对形式参数的任何引用和赋值都通过传递到被调用过程的指针被处理成间接访问到被调用过程的指针被处理成间接访问.实参实参形参形参左左值值右值右值3、传名、传名4、得结果、得结果每个形式单元分配两个单元,分别存储实参的左值和右每个形式单元分配两个单元,分别存储实参的左值和右值,右值单元参加运算;过程结束返回被调用过程时,值,右值单元参加运算;过程结束返回被调用过程时,将右值单元的值写入左值单元所指示的单元。将右值单元的值写入左值单元所指示的单元。实参实参形参形参左左值值右值右值10.4 过程调用、过程进入和过程返回过程调用、过程进入和过程返回过程调用的四元式:过程调用的四元式
32、:par T1 par T2 par Tn call P,nPar Ti:根据根据Ti的种别而生成传送指令,或将参数的地址的种别而生成传送指令,或将参数的地址传送至新的过程的活动记录的形式单元中。传送至新的过程的活动记录的形式单元中。Call p,n:生成传送参数个数生成传送参数个数n的指令;保护现行的指令;保护现行SP至新至新过程的活动记录(老过程的活动记录(老SP););转子,转向转子,转向P的第一条指的第一条指令;定义新令;定义新SP;保护返回地址;定义新值;填写保护返回地址;定义新值;填写display或存取链内容等。或存取链内容等。过程返回时:若过程返回时:若P是一个函数过程时,则可
33、把已算好的值是一个函数过程时,则可把已算好的值传送至某个特定的寄存器中,调用段将从这个特定的传送至某个特定的寄存器中,调用段将从这个特定的寄存器中获得被调过程的结果值。然后所生成的目标寄存器中获得被调过程的结果值。然后所生成的目标指令则应完成的工作是:恢复指令则应完成的工作是:恢复SP;恢复恢复TOP,按保存按保存的返回地址实行无条件转移。的返回地址实行无条件转移。练习:下面的程序执行时输出的练习:下面的程序执行时输出的a分别是什么?分别是什么?(分别在传值、传地址、传名和得结果的情况下)(分别在传值、传地址、传名和得结果的情况下)Program main(input,output);proc
34、edure p(x,y,z);beginy:=y+1;z:=z+x;end;begin a:=2;b:=3;p(a+b,a,a);print a end.堆式动态存储分配需求:需求:n 一个程序语言允许用户自由地申请数据空间和退还一个程序语言允许用户自由地申请数据空间和退还数据空间,或者不仅有过程而且有进程数据空间,或者不仅有过程而且有进程(process)的程序结构,的程序结构,操作:操作:n堆提供两个操作,分配操作和释放操作堆提供两个操作,分配操作和释放操作情况情况:n经一段运行时间之后,这个大空间就必定被分划成经一段运行时间之后,这个大空间就必定被分划成许多块块,有些占用,有些无用(空闲
35、)许多块块,有些占用,有些无用(空闲)-碎片问碎片问题题程序语言允许用户自由地申请数据空间和退还数据空间C+语语言言中中new操操作作符符施施加加在在一一个个类类型型标标识识符上(包括类名)符上(包括类名)Pascal语语言言中中,标标准准过过程程new能能够够动动态态建建立立存存储储空空间间并并相相应应地地置置上上指指针针。标标准准过过程程dispose是是释释放放空空间间.new与与dispose不不断断改改变变着着堆堆存存储储器的使用情况。器的使用情况。C语语言言中中有有这这些些操操作作的的若若干干个个版版本本,但但最最基基本本的的 是是 malloc和和 free,它它 们们 都都 是
36、是 标标 准准 库库(stdlib)的一部分)的一部分面向对象的语言的动态存储面向对象的语言的动态存储面面向向对对象象的的语语言言在在运运行行时时环环境境中中要要求求特特殊殊的的机机制制以以完完成成其其增增添添的的特特性性:对对象象、方方法法、继承以及动态绑定。继承以及动态绑定。面面向向对对象象语语言言在在对对运运行行时时方方面面的的要要求求差差异异很很大。大。Smalltalk与与LISP相似是完全堆式环境相似是完全堆式环境C则保持则保持C的基于栈的环境的基于栈的环境实现对象实现对象的一个简单机制是,初始化代码将所有当前的继承特征实现对象的一个简单机制是,初始化代码将所有当前的继承特征(属性
37、和方法)直接地复制到记录结构中(将方法当作代码指针)(属性和方法)直接地复制到记录结构中(将方法当作代码指针)。但这样做极浪费空间。但这样做极浪费空间。另外一种方法是在执行时将类结构的一个完整的描述保存在每个类另外一种方法是在执行时将类结构的一个完整的描述保存在每个类的存储中,并由超类指针维护继承性(有时这也称作继承图的存储中,并由超类指针维护继承性(有时这也称作继承图(inheritance graph)。每个对象保持一个指向其定义类的。每个对象保持一个指向其定义类的指针,作为一个附加的域和它的实例变量放在一起,通过这个类指针,作为一个附加的域和它的实例变量放在一起,通过这个类就可找到所有(
38、局部和继承的)的方法。此时,只记录一次方法就可找到所有(局部和继承的)的方法。此时,只记录一次方法指针(在类结构中),而且对于每个对象并不将其复制到存储器指针(在类结构中),而且对于每个对象并不将其复制到存储器中。由于是通过类继承的搜索方法的,所以该机制还实现继承性中。由于是通过类继承的搜索方法的,所以该机制还实现继承性与动态联编。其缺点在于:虽然实例变量具有可预测的偏移量与动态联编。其缺点在于:虽然实例变量具有可预测的偏移量(正如在标准环境中的局部变量一样),方法却没有,而且它们(正如在标准环境中的局部变量一样),方法却没有,而且它们必须由带有查询功能的符号表结构中的名字维护。这是对于诸如必
39、须由带有查询功能的符号表结构中的名字维护。这是对于诸如Smalltalk的高度动态语言的合理的结构,因为类结构可以在执的高度动态语言的合理的结构,因为类结构可以在执行中改变。行中改变。折衷方法将将整整个个类类结结构构保保存存在在存存储储中中,计计算算出出每每个个类类的的可可用用方方法法的的代代码码指指针针列列表表(称称为为方方法法索索引引表表,如如:C+的的virtual function table)。它它的的优优点点在在于于:可可做做出出安安排排以以使使每每个个方方法法都都有有一一个个可可预预测测的的偏偏移移量量,而而且且也也不不再再需需要要用用一一系系列列表表查查询询遍遍历历类类的的层层
40、次次结结构构。现现在在每每个个对对象象不不仅仅包包括括实实例例变变量量还还包包括括了了一一个个相相应应的的方方法法索索引引表表的的指指针针而而不不是是类类结结构构的的指指针针(当当然然,这个指针的位置必须也有可预测的偏移量)。这个指针的位置必须也有可预测的偏移量)。class A int m1;void f1()class B extends A void f2()class C entends B void f2()class D extends Cbool m2;void f1()class A a;class B b;class C c;class D d1,d2;m1m1m2对象对象c
41、对象对象d1对象对象d2m1m2m1对象对象bm1对象对象aA_f1类类AB_f2A_f1类类BC_f2A_f1类类CC_f2D_f1类类D某个单继承O-O语言的对象存储示意某个O-O语言的程序例子string day;class Fruit int price;string name;void init(int p,string s)price=p;name=s;void print()Print(On,day,the price of,name,is,price,n);class Apple extends Fruit string color;void setcolor(string c
42、)color=c;void print()Print(On,day,the price of,color,name,is,price,n);void foo()class Apple a;a=New(Apple);a.init(100,apple);a.setcolor(red);day=Tuesday;a.print();它的运行时存储组织临时变量临时变量局部变量局部变量控制链控制链(EBP)返回地址返回地址(EIP)实参实参Apple的实例的实例Vtable of FruitVtable of Applevtableint price(100)string name string colorFruit.initFruit.printFruit.initApple.printApple.setcolor栈区栈区堆区堆区