文档详情

编译原理第六章运行时存储空间的组织和管理.ppt

发布:2017-05-19约2.14万字共110页下载文档
文本预览下载声明
中国科大 第六章 运行时存储空间的组织和管理 术语 过程的活动 过程的一次执行称为过程的一次活动 活动记录 过程的活动需要可执行代码和存放所需信息的存储空间,后者称为活动记录 本章内容 讨论一个活动记录中的数据布局 程序执行过程中,所有活动记录的组织方式 第六章 运行时存储空间的组织和管理 影响存储分配策略的语言特征 过程能否递归 当控制从过程的活动返回时,局部变量的值是否要保留 过程能否访问非局部变量 过程调用的参数传递方式 过程能否作为参数被传递 过程能否作为结果值传递 存储块能否在程序控制下动态地分配 存储块是否必须显式地释放 6.1 局部存储分配 6.1.1 过程 语言概念: 过程定义、过程调用、形式参数、实在参数、活动的生存期 6.1 局部存储分配 6.1.2 名字的作用域和绑定 1、名字的作用域 一个声明起作用的程序部分称为该声明的作用域 6.1 局部存储分配 2、环境和状态 环境把名字映射到左值,而状态把左值映射到右值(即名字到值有两步映射) 赋值改变状态,但不改变环境 过程调用改变环境 如果环境将名字x映射到存储单元s,则说x被绑定到s 6.1 局部存储分配 3、静态概念和动态概念的对应 6.1 局部存储分配 3、静态概念和动态概念的对应 6.1 局部存储分配 3、静态概念和动态概念的对应 6.1 局部存储分配 6.1.3 活动记录 活动记录的常见布局 6.1 局部存储分配 6.1.4 局部数据的布局 字节是可编址内存的最小单位 一个过程所声明的局部变量,按这些变量声明时出现的次序,在局部数据域中依次分配空间 局部数据的地址可以用相对于某个位置的地址来表示 数据对象的存储布局还有一个对齐问题 6.1 局部存储分配 例 在SPARC/Solaris工作站上下面两个结构体的size分别是24和16,为什么不一样? typedef struct _a{ typedef struct _b{ char c1; char c1; long i; char c2; char c2; long i; double f; double f; }a; }b; 对齐:char : 1, long : 4, double : 8 6.1 局部存储分配 例 在SPARC/Solaris工作站上下面两个结构体的size分别是24和16,为什么不一样? typedef struct _a{ typedef struct _b{ char c1; 0 char c1; 0 long i; 4 char c2; 1 char c2; 8 long i; 4 double f; 16 double f; 8 }a; }b; 对齐:char : 1, long : 4, double : 8 6.1 局部存储分配 例 在X86/Linux机器的结果和SPARC/Solaris工作站不一样,是20和16。 typedef struct _a{ typedef struct _b{ char c1; 0 char c1; 0 long i; 4 char c2; 1 char c2; 8 long i; 4 double f; 12 double f; 8 }a; }b; 对齐:char : 1, long : 4, double : 4 6.1 局部存储分配 6.1.5 程序块 本身含有局部变量声明的语句 可以嵌套 最接近的嵌套作用域规则 并列程序块不会同时活跃 并列程序块的变量可以重叠分配 6.1 局部存储分配 main() / ? 例 ?/ { /? begin of B0 ?/ int a = 0; int b = 0; { /? begin of B1 ?/ int b = 1; {/? begin of B2 ?/ int a = 2; }/? end of B2 ?/ {/? begin of B3 ?/ int b = 3; }/? end of B3 ?/ }/? end of B1 ?/ }/? end of B0 ?/ 6.2 全局栈式存储分配 本节介绍 描述过程的目标代码怎样访问绑定到局部名字的存储单元 介绍三种分配策略 静态分配策略 栈式分配策略 堆式分配策略 6.2 全局栈式存储分配 6.2.1
显示全部
相似文档