数组就地映射实现存储大小缩减
1. 前提假设
我们对用 C 语言子集编写的程序进行转换。该子集仅允许使用赋值语句、if - then - else 语句和 for 循环。此外,代码需满足以下要求:
- 程序采用单赋值形式,即每个数组元素最多被写入一次(可以被读取多次)。
- 数组访问中使用的索引表达式、if - then - else 语句的条件以及 for 循环迭代器的上下界,都是周围 for 循环迭代器的线性组合。
- 被赋值的数组元素,在后续也会被读取。
2. 预处理
在处理的第一步,我们会对源程序进行一些转换以简化代码:
- 由于一次只分析一个数组,所以只保留 for 循环语句和访问目标数组的语句。
- 应用一些转换来简化 if 语句的结构,包括将 then 和 else 分支中共同的访问操作提取到 if 语句之外,以及将嵌套的 if 语句替换为简单的 if 语句。
这些步骤可以减少程序点的数量,从而降低后续分析的成本。最终的程序可以转换为仅由 for 循环和带有执行条件注释的赋值语句组成,例如:
for (...)
⟨Cond1⟩: A[expi][expj] = ;
for (...)
⟨Cond2⟩: A[expk][expl] = A[expm][expn];
...
下面是一个简单的流程图展示预处理的流程:
graph LR
A[源程序] --> B[保
超级会员免费看
订阅专栏 解锁全文
26

被折叠的 条评论
为什么被折叠?



