gpt4 book ai didi

swift - 在通用类型数据中使用时是否会转义闭包?

转载 作者:搜寻专家 更新时间:2023-10-31 19:29:00 24 4
gpt4 key购买 nike

在下面的示例中,测试闭包作为函数参数传入,它不需要@escaping。这是否意味着它算作一个 noescape 闭包?我想知道这是否可以解决因转义导致的堆分配问题。

func test() {
print("hello")
}

class b<T> {
let closure: T
// does not requires init(c: @escaping () -> Void)
init(c: T) {
self.closure = c
}
}

var c = b(c: test)

最佳答案

Does it mean it counts as a noescape closure?

不,当然不是。它转义了传递给它的函数的生命周期(在本例中为 init(c:))——因此,根据定义,它正在转义。您不必将其标记为 @escaping 因为 只有 闭包函数参数(即本身被类型化为函数的函数参数)在默认情况下是非转义的(如根据 SE-0103 )。

因此,因为闭包正在转义,所以它需要它捕获的任何状态来进行堆分配。这个状态不可能被堆栈分配,因为它的生命周期不限于当前堆栈帧。

但是在您的情况下,您只是传递了一个简单的全局函数 test。这里不需要额外的堆分配,因为全局函数是静态存储的,因此只需要传递一个简单的指针。

尽管值得注意的是,因为您正在使用泛型,为了将函数键入给定的泛型占位符 T,Swift 将使用重新抽象 thunk为了统一调用约定。为此,将使用堆分配框来存储函数值(我在 this Q&A 中对此进行了更详细的介绍)。

然而,在优化构建中,它 appears the thunk is able to be specialised在某些情况下(例如直接使用顶级函数),这意味着不需要进行额外的堆分配。

关于swift - 在通用类型数据中使用时是否会转义闭包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41732936/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com