![]() |
1
2
闭包中使用的可变自由变量(
有两个问题需要考虑。首先,生存期:变量可能超过创建它的范围。(
最简单的解决方案是将变量更改为“box”(一个对象的容器,该对象是变量的值)。框本身是不可变的(也就是说,名称总是指同一个框)。变量值的修改和引用成为容器setter和getter方法。当然,当不再需要时,必须动态分配和回收值的存储(与任何容器一样)。
首先,如果变量从未被修改,则可能会给每个闭包一个值的副本,而不是装箱值。
证明这些优化在特定程序中的有效性需要良好的静态分析。第一种方法很简单,因为修改在语法上很容易检测,但第二种方法需要流分析(至少)。 在上述内容中,我对可能应用优化的情况进行了保守描述,只需要简单的流量分析;检测其他可能的应用程序更加复杂。 |