为什么 Slice<T> 的容量总是偶数?
Why do Slice<T>s always have an even capacity?
我目前在项目中使用 Slice
类型。
我注意到一些奇怪的行为,所以我决定仔细看看 Slice
s。在测试时我发现 this:
var slice = Slice<Int>()
var range = 1...9
let length = range.endIndex - range.startIndex
println(" length of 'range': \(length)") //prints "length of 'range': 9"
slice.reserveCapacity(length)
println("capacity of 'slice': \(slice.capacity)") //prints "capacity of 'slice': 10"
现在,当更改 range
时,slice
的 capacity
仍然总是四舍五入到下一个偶数。这是为什么?
更新#1:
现在第一个问题已经被@MartinR 解决了。不过,我问这个问题的最初原因如下。
让我们添加这段代码:
for index in range.startIndex..<range.endIndex {
slice[index - range.startIndex] = index
}
我认为它会做的是用 range
的值填充 slice
。它没有,实际上是这样说的:fatal error: Slice index out of range
.
但是,当我检查索引时,例如 here,它们很好。
为什么会这样?
增加容量只分配内存,不会增加slice的endIndex
您仍然需要追加 个新元素:
for index in range.startIndex..<range.endIndex {
slice.append(index)
}
与
相同
slice += range
或者您可以用新的切片替换空切片,例如
slice.replaceRange(0 ..< 0, with: range)
我目前在项目中使用 Slice
类型。
我注意到一些奇怪的行为,所以我决定仔细看看 Slice
s。在测试时我发现 this:
var slice = Slice<Int>()
var range = 1...9
let length = range.endIndex - range.startIndex
println(" length of 'range': \(length)") //prints "length of 'range': 9"
slice.reserveCapacity(length)
println("capacity of 'slice': \(slice.capacity)") //prints "capacity of 'slice': 10"
现在,当更改 range
时,slice
的 capacity
仍然总是四舍五入到下一个偶数。这是为什么?
更新#1:
现在第一个问题已经被@MartinR 解决了。不过,我问这个问题的最初原因如下。
让我们添加这段代码:
for index in range.startIndex..<range.endIndex {
slice[index - range.startIndex] = index
}
我认为它会做的是用 range
的值填充 slice
。它没有,实际上是这样说的:fatal error: Slice index out of range
.
但是,当我检查索引时,例如 here,它们很好。
为什么会这样?
增加容量只分配内存,不会增加slice的endIndex
您仍然需要追加 个新元素:
for index in range.startIndex..<range.endIndex {
slice.append(index)
}
与
相同 slice += range
或者您可以用新的切片替换空切片,例如
slice.replaceRange(0 ..< 0, with: range)