什么是静态分配?
这是最简单的分配方案,其中数据对象的分配在编译时完成,因为每个数据项的大小都可以由编译器确定。静态分配的主要功能是将数据项绑定到特定的内存位置。静态内存分配过程包括确定指令和数据空间的大小。
递归子程序和可调整长度的数组在语言中是不允许的。在静态分配中,编译器可以决定每个数据对象所需的存储量。因此,编译器很容易找到这些数据在激活记录中的地址。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 语句是将控制返回给操作系统的最终指令。
优点
- 易于实现。
- 允许在编译期间进行类型检查。
- 消除了内存不足的可能性。
缺点
- 与递归子程序不兼容。
- 无法使用大小必须在运行时确定的变量。
- 如果在编译时知道数据对象的大小,则可以进行静态分配。
- 不能动态创建数据结构,这意味着静态分配无法管理运行时的内存分配。
广告