@guaranteed属性在swift中有什么作用?我已经看到它在blog post中使用但无法理解。
以下是我所指的帖子的摘录。
我们可以强制编译器避免这些保留和释放 使该函数成为PThreadMutex的扩展,而不是免费的 功能:
extension PThreadMutex { private func sync<R>(execute: () throws -> R) rethrows -> R { pthread_mutex_lock(&m) defer { pthread_mutex_unlock(&m) } return try execute() } }
这会强制Swift将
self
参数视为@guaranteed
, 消除保留/释放开销,我们终于到了 基线0.264秒。
答案 0 :(得分:3)
@guaranteed
不是可在Swift中使用的属性,它实际上是SIL(Swift中间语言)属性 - 它定义了一个函数参数内存管理约定。
The three possible conventions是:
无主 - 调用者或被调用者都没有声明传递值的所有权,但保证在调用时有效(除非被调用者做了某些事情使其无效)
拥有 - 被调用者拥有该值的所有权。调用者在传递之前会保留该值,然后调用者有责任在完成后释放它。
保证 - 来电者声明该值的所有权,允许被叫方保证在通话时有效。
在您提到的帖子中,sync(mutex:execute:)
最初定义为全局函数,默认情况下(AFAIK)将使用拥有的约定作为其参数。因此,传递给mutex
参数的值将在传递给函数之前由调用者保留,然后一旦完成就会释放。
但是,如果传递给函数的值具有超出函数调用范围的生命周期,那么拥有的约定的保留/释放开销是不必要的,这很可能是互斥锁的情况。正如帖子观察到的那样,即使在内联调用之后,编译器也没有消除这种保留/释放开销。
因此,如上所述,解决方案是将mutex:
参数视为保证,这将允许编译器消除开销,就好像调用者已保留互斥锁一样,然后不需要任何进一步的保留,以保证在sync
电话的持续时间内存在。
正如帖子所说,这样做的方法是制作sync
PThreadMutex
的实例方法。这是因为,作为Joe Groff says in this mailing list discussion,与Swift 2一样,实例方法会将self
参数视为保证。