编译原理(7):运行存储分配

声明:本系列文章,是根据中国大学MOOC网 哈工大的编译原理 这门课学习而成的学习笔记。
运行存储分配

一、运行存储分配概述

运行存储分配策略
  • 编译器在工作过程中,必须为源程序中出现的一些数据对象分配运行时的存储空间
  • 对于那些在编译时刻就可以确定大小的数据对象,可以在编译时刻就为它们分配存储空间,这样的分配策略称为静态存储分配
  • 反之,如果不能在编译时完全确定数据对象的大小,就要采用动态存储分配的策略。即在编译时仅产生各种必要的信息,而在运行时刻,再动态地分配数据对象的存储空间
    • 栈式存储分配
    • 堆式存储分配
      在这里插入图片描述
运行时内存的划分

在这里插入图片描述

活动记录
  • 使用过程(或函数、方法)作为用户自定义动作的单元的 语言,其编译器通常以过程为单位分配存储空间
  • 过程体的每次执行称为该过程的一个活动(activation)
  • 过程每执行一次,就为它分配一块连续存储区,用来管理过程一次执行所需的信息,这块连续存储区称为活动记录( activation record )
活动记录的一般形式

在这里插入图片描述

二、静态存储分配

静态存储分配
  • 在静态存储分配中,编译器为每个过程确定其活动记录在目标程序中的位置
  • 这样,过程中每个名字的存储位置就确定了
  • 因此,这些名字的存储地址可以被编译到目标代码中
  • 过程每次执行时,它的名字都绑定到同样的存储单元
静态存储分配的限制条件
  • 适合静态存储分配的语言必须满足以下条件
    • 数组上下界必须是常数
    • 不允许过程的递归调用
    • 不允许动态建立数据实体
  • 满足这些条件的语言有BASIC和FORTRAN等
常用的静态存储分配方法
  • 顺序分配法
  • 层次分配法
顺序分配法
  • 按照过程出现的先后顺序逐段分配存储空间
  • 各过程的活动记录占用互不相交的存储空间
    在这里插入图片描述
层次分配法

通过对过程间的调用关系进行分析,凡属无相互调用关系的并列过程,尽量使其局部数据共享存储空间
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值