Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift中的@guaranted属性做什么?_Swift - Fatal编程技术网

Swift中的@guaranted属性做什么?

Swift中的@guaranted属性做什么?,swift,Swift,@guaranted属性在swift中的作用是什么?我见过它用在这个,但不能理解它 我指的是这篇文章的摘录 我们可以通过以下方式强制编译器避免这些保留和释放 使函数成为PThreadMutex上的扩展,而不是免费的 功能: extension PThreadMutex { private func sync<R>(execute: () throws -> R) rethrows -> R { pthread_mutex_lock(&m)

@guaranted属性在swift中的作用是什么?我见过它用在这个,但不能理解它

我指的是这篇文章的摘录

我们可以通过以下方式强制编译器避免这些保留和释放 使函数成为PThreadMutex上的扩展,而不是免费的 功能:

extension PThreadMutex {
   private func sync<R>(execute: () throws -> R) rethrows -> R {
      pthread_mutex_lock(&m)
      defer { pthread_mutex_unlock(&m) }
      return try execute()
   }
}
扩展PThreadMutex{ 专用函数同步(执行:()抛出->R)重试->R{ pthread_mutex_lock(&m) 延迟{pthread_mutex_unlock(&m)} 返回try execute() } } 这迫使Swift将
self
参数视为
@担保的
, 消除了保留/释放开销,我们最终实现了 基线0.264秒


@保证
不是Swift本身可用的属性,它实际上是一个(Swift中间语言)属性–定义函数参数内存管理约定

对于参数传递,有:

  • 无主–调用者或被调用者均未声明传递值的所有权,但保证在调用时它是有效的(除非被调用者采取措施使其无效)

  • 拥有–被调用方拥有价值的所有权。调用者将在传递之前保留该值,然后被调用者有责任在完成后释放该值

  • 保证–调用方声明值的所有权,允许被调用方保证值在调用时有效

在您提到的帖子中,
sync(mutex:execute:)
最初被定义为一个全局函数,默认情况下(AFAIK)将使用自己的约定作为其参数。因此,传递给
mutex
参数的值将由调用方保留,然后再传递给函数,函数完成后将释放该值

但是,如果传递给函数的值的生存期超出了函数调用,则拥有的约定的保留/释放开销是不必要的,这很可能是互斥的情况。正如post所观察到的,即使在内联调用之后,编译器也不会消除这种保留/释放开销

因此,如前所述,解决方案是将
mutex:
参数视为保证参数,这将允许编译器消除开销,就好像调用者已经保留了mutex一样,那么就不需要进一步保留以保证它在
sync
调用期间的存在

正如文章所说,实现这一点的方法是将
sync
作为
PThreadMutex
的实例方法。这是因为,从Swift 2开始,实例方法将把
self
参数视为有保证的。

答案不错。(在这里,我认为这意味着你会100%满意这个价值,或者你可以拿回你的钱。)