欢迎来到天天文库
浏览记录
ID:37812596
大小:225.77 KB
页数:30页
时间:2019-05-31
《第10章 运行时的存储组织与分配 [兼容模式]》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、Compilers:PrinciplesandTechniquesPrinciplesandTechniquesChapter10Run-TimeEnvironmentsSpring2014liweihuaDepartmentofComputerScience&technology,InformationalDepartmentofComputerScience&technology,Informationalschool,YunnanUniversity1运行时存储组织µ运行时存储组织的作用与任务µ程序在存储器中的布局µ存储分配策略µ活动记录2运行时存储组
2、织µ运行时存储组织的作用与任务−代码生成前如何安排目标机资源的使用−几个问题•数据表示如何在目标机中表示每个源语言类型的值•存储分配如何组织不同作用域变量的存储•过程实现如何实现过程/函数调用,参数传递3运行时存储组织µ代码生成前需要安排目标机资源的使用−代码生成的实质•建立如下关联/绑定(biding)源程序/中间代码的脚本↔运行时的脚本源程序/中间代码的名字↔运行时的存储−目标机资源的使用•内存/缓存:存放目标代码和数据(包括系统数据)•寄存器:存放控制信息和数据信息(常为中间信息)•操作系统资源4运行时存储组织µ数据表示−源程序中数据对象在内存或寄存器
3、中的表示形式•源程序中数据对象的属性名字(name),类型(type),值(value),成员(component),偏移地址(offset),……•数据对象在内存或寄存器中的表示形式位、字节、字、字节序列、……•有些机器要求数据存放时要按某种方式对齐(align)如:要求所有数据存放的起始地址为能够被4整除5运行时存储组织µ数据表示举例−基本类型数据char数据1btbyteiitnteger数据4btbytesfloat数据8bytesboolean数据1bit/1byte指针4bytes数组一块连续的存储区(按行/列存放)结构/记录所有域(field)
4、存放在一块连续的存储区6运行时存储组织µ程序在存储器中的布局(layout)−典型的程序布局LowestaddressReservedLocations•保留地址段Code目标机体系结构专用•代码段静态存放目标代码StaticDataStaticData•静态数据段StackSpace静态存放全局数据↓•动动数态数据据段↑HeapSpace运行时动态变化的堆区和栈区Highestaddress7运行时存储组织µ存储分配策略−静态分配•在编译期间为数据对象分配存储−动态分配•栈式分配将数据对象的运行时存储按照栈的方式来管理•堆式分配从数据段的堆空间分配和释放数
5、据对象的运行时存储8运行时存储组织µ静态存储分配−在编译期间就可确定数据对象的大小•不宜处理递归过程或函数−某些语言中所有存储都是静态分配•如汇编语言,FORTRAN语言−多数语言只有部分存储进行静态分配•可静态分配的数据对象如大小固定且在程序执行期间可全程访问的全局变量,以及程序中的常量(literals,constants)•如C语言中的sttitatic和extern变量9运行时存储组织µ栈式存储分配−用于有效实现层次嵌套的程序结构•如实现过程/函数,块层次结构−可以实现递归过程/函数•比较:静态分配不宜实现递归过程/函数−运行栈中的数据单元是活动记录
6、(actiationrecordactivationrecord)(专门介绍)10运行时存储组织µ堆式存储分配−从堆空间为数据对象分配/释放存储•灵活数据对象的存储分配和释放不限时间和次序−显式的分配或释放(explicitallocation/dealocation)•程序员负责应用程序的(堆)存储空间管理(借助于)编译器和运行时系统所提供的默认存储管理机制)−隐式的分配或释放(implicitallocation/dealocation)•(堆)存储空间的分配或释放不需要程序员负责,由编译器和运行时系统自动完成11运行时存储组织µ堆式存储分配−某些语言有
7、显式的堆空间分配和释放命令•如:Pascal中的new,depositC++中的new,delete•比较:C语言没有堆空间管理机制,malloc()和free()是标准库中的函数,可以由libraryvendor提供−某些语言支持隐式的堆空间释放−不释放堆空间的方法ò只分配空间,不释放空间,空间耗尽时停止ò适合于堆数据对象多数为一旦分配,永久使用的情形ò在虚存很大及无用数据对象不致带来很大零乱的情形也可采用12运行时存储组织µ堆式存储分配−显式释放堆空间的方法•用户负责清空无用的数据空间(通过执行释放命令)•堆管理程序只维护可供分配命令使用的空闲空间•问题
8、:可能导致灾难性的danglingpointer错误
此文档下载收益归作者所有