Swift中的@guaranteed属性有什么作用?

时间:2016-10-03 20:19:11

标签: swift

@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秒。

1 个答案:

答案 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参数视为保证。