Swift 数组边界检查优化的工作原理

How Swift Array Bounds Checks Optimization works

我在看WWDC 2015 session 409 - Optimizing Swift Performance 。它提到 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
 }

我确实在构建设置下将禁用安全检查设置为。我认为这应该打开数组边界检查。任何人都知道为什么?

演讲中的示例显示了 precondition() 的使用,但您的代码似乎没有使用 precondition()