2016-10-03 2 views
2

Что делает атрибут @guaranteed в swift? Я видел, как он использовался в этом blog post, но не мог этого понять.Что делает атрибут @guaranteed в 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() 
    } 
} 

Это заставляет Свифт лечить параметр self, как @guaranteed, , устраняя удержание/освобождение накладных расходов, и мы, наконец, до базовой линии 0.264 секунды.

ответ

2

@guaranteed не является атрибутом, который доступен для использования в Swift себя, это на самом деле SIL (Swift Intermediate Language) атрибут - который определяет соглашение управления памятью параметров функции.

The three possible conventions для передачи параметров являются:

  • бесхозного - Ни вызывающие или вызываемый абонент утверждает, владение переданного значения, но это гарантировано будет действительным в момент вызова (если не вызываемый делает что-то, чтобы сделать это недействительным).

  • принадлежит - Указ имеет право собственности на стоимость. Вызывающий абонент сохранит значение перед его передачей, а затем ответственное лицо освободит его после его выполнения.

  • Гарантировано - Абонент заявляет права собственности на стоимость, позволяя вызываемому иметь гарантию того, что он будет действителен во время разговора.

В посте вы упоминаете, sync(mutex:execute:) изначально определяется как глобальная функция, которая (AFAIK) по умолчанию будет использовать конвенцию принадлежит для его параметров. Поэтому значение, переданное параметру mutex, будет сохранено вызывающим абонентом перед передачей функции, которое затем будет выпущено после его завершения.

Однако эти служебные данные для сохранения/освобождения для условного соглашения не нужны, если значение, переданное функции, имеет продолжительность жизни, которая выходит за пределы вызова функции, что, скорее всего, имеет место с мьютексом. Как видно из сообщения, даже после встраивания вызова компилятор не устраняет эту проблему с сохранением/выпуском.

Поэтому, как было сказано, решение для лечения параметр mutex: в гарантировано, что позволит компилятору устранить накладные расходы, как если мьютекс уже удерживается вызывающим абонентом, то нет никакой необходимости в дальнейшем сохраняется, чтобы гарантировать его существование в течение всего времени вызова sync.

Способ сделать это, как говорится в сообщении, состоит в том, чтобы сделать sync методом экземпляра PThreadMutex.Это связано с тем, что в качестве Joe Groff says in this mailing list discussion, как и для Swift 2, методы экземпляра будут обрабатывать параметр self как гарантированный.

+1

Хороший ответ. (Здесь я думал, что это означает, что вы будете на 100% удовлетворены этим значением или можете вернуть свои деньги.;) – rickster

Смежные вопросы