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