22、数组就地映射实现存储大小缩减

数组就地映射实现存储大小缩减

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[保
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值