什么是静态分配?


这是最简单的分配方案,其中数据对象的分配在编译时完成,因为每个数据项的大小都可以由编译器确定。静态分配的主要功能是将数据项绑定到特定的内存位置。静态内存分配过程包括确定指令和数据空间的大小。

递归子程序和可调整长度的数组在语言中是不允许的。在静态分配中,编译器可以决定每个数据对象所需的存储量。因此,编译器很容易找到这些数据在激活记录中的地址。FORTRAN 使用这种存储分配策略。

名称与分配的存储量之间的绑定在运行时不会更改。因此,这种分配的名称是静态分配。在静态分配中,编译器可以决定每个数据对象所需的存储量。因此,编译器很容易找到这些数据在激活记录中的地址。

在编译时,编译器可以填充目标代码可以找到其操作数据的地址。

调用语句的实现

实现静态分配所需的代码如下:

MOV #here +20, callee.static_area /*保存返回地址*/

GOTO callee.code_area /*将控制转移到被调用过程的目标代码*/

其中

callee.static_area — 激活记录的地址。

callee.code_area — 被调用过程的第一个指令的地址。

#here +20 — 字面返回地址,它是 GOTO 后面指令的地址。

返回语句的实现

从过程 callee 返回的实现方式为:

GOTO * callee.static_area

这将控制转移到保存在激活记录开头的地址。

动作语句的实现

ACTION 指令用于实现动作语句。

停止语句的实现

HALT 语句是将控制返回给操作系统的最终指令。

优点

  • 易于实现。
  • 允许在编译期间进行类型检查。
  • 消除了内存不足的可能性。

缺点

  • 与递归子程序不兼容。
  • 无法使用大小必须在运行时确定的变量。
  • 如果在编译时知道数据对象的大小,则可以进行静态分配。
  • 不能动态创建数据结构,这意味着静态分配无法管理运行时的内存分配。


更新于:2021年11月8日

6000+ 次浏览

启动你的职业生涯

通过完成课程获得认证

开始学习
广告