Как работает оптимизация проверки границ массива Swift

Я смотрел сессию WWDC 2015 409 - Оптимизация производительности Swift. Он упомянул, что Swift обеспечивает доступ к массиву в определенных пределах. И Свифт может поднимать чеки из петель. Так что проверки O(n) становятся O(1).

Пример из разговора выглядит так:

//Before Optimization
for i in 0..<n {
    precondition (i < length)
    A[i] ^= 13
}

//After Optimization
precondition (i < length)
for i in 0..<n {
    A[i] ^= 13
}

Насколько я понимаю, компилятор должен выполнять так называемую проверку границ массива, когда коды компилируются. Но я не увидел предупреждения компилятора при тестировании с использованием следующих кодов. Вместо этого он разбился во время выполнения.

 var a = Array(1...5)

 for i in 0..<6 {
     a[i] ^= 13
 }

И я установил Disable Safety Checks на " Нет" в настройках сборки. Я думаю, что это должно включить проверки границ массива. Кто-нибудь знает почему?

1 ответ

Решение

Пример из выступления показывает использование precondition(), но ваш код, похоже, не использует precondition ()

Другие вопросы по тегам