假设我有一种静态/词法作用域的语言,具有深层绑定,并且我创建了一个闭包。该闭包将包含我想执行的语句以及所谓的引用环境,或者引用此帖子中所引述的可用变量集合。
从实现的角度来看,这个引用环境实际上是什么样子?我最近阅读了有关ObjectiveC块实现的文章,作者提到在幕后,您将获取堆栈上所有变量以及对堆对象的所有引用的副本。解释称,您会在闭包创建时获取引用环境的“快照”。
1.那是否更多或更少是发生了什么,还是我理解有误? 2.是否需要“冻结”堆对象的单独副本?或者可以安全地假设如果它们在闭包创建和执行闭包之间被修改,则闭包将不再操作对象的原始版本? 3.如果确实进行了复制,请问当需要创建大量闭包并将它们存储在某个位置时,是否存在内存使用考虑因素?
我认为对一些概念的误解可能会导致棘手的问题,例如Eric Lippert在这篇博客文章中提到的问题。这很有趣,因为您认为保留可能在闭包被调用时消失的值类型的引用是没有意义的,但我猜想在C#中编译器会发现变量稍后需要并将其放入堆中。
似乎在大多数内存管理语言中,所有内容都是引用,因此ObjectiveC是一种相对独特的情况,必须处理复制堆栈上的内容。
从实现的角度来看,这个引用环境实际上是什么样子?我最近阅读了有关ObjectiveC块实现的文章,作者提到在幕后,您将获取堆栈上所有变量以及对堆对象的所有引用的副本。解释称,您会在闭包创建时获取引用环境的“快照”。
1.那是否更多或更少是发生了什么,还是我理解有误? 2.是否需要“冻结”堆对象的单独副本?或者可以安全地假设如果它们在闭包创建和执行闭包之间被修改,则闭包将不再操作对象的原始版本? 3.如果确实进行了复制,请问当需要创建大量闭包并将它们存储在某个位置时,是否存在内存使用考虑因素?
我认为对一些概念的误解可能会导致棘手的问题,例如Eric Lippert在这篇博客文章中提到的问题。这很有趣,因为您认为保留可能在闭包被调用时消失的值类型的引用是没有意义的,但我猜想在C#中编译器会发现变量稍后需要并将其放入堆中。
似乎在大多数内存管理语言中,所有内容都是引用,因此ObjectiveC是一种相对独特的情况,必须处理复制堆栈上的内容。