保留容量(Swift)与调整大小(C++)
我尝试将 C++ 代码转换为 Swift。我有一个用C++编写的方法(简化示例)
std::vector<int> list;
void foo() {
...
while(isOk) {
list.resize(10000); //resize do it's job only if list.capasity < requested size
for(int i = 0; i < 10000; i++) {
list[i] = i;
}
}
...
}
迅捷的一面:
var arr: [Int] = []
do {
while true {
arr.reserveCapacity(10000)
for i in 0..<10000 {
arr[i] = i
}
}
}
错误是:
错误:执行被中断,原因:EXC_BAD_INSTRUCTION(代码=EXC_I386_INVOP,子代码=0x0)。
根据文档reserveCapacity分配请求的大小,但是为什么当我尝试向特定单元格写入内容时出现错误?
回答
您将数组的底层存储与数组的实际大小混淆了。Swift 中的数组是动态的,因此您可以append()并且数组的大小会相应地增长。在内部,Swift 会为您管理底层内存的分配方式,因此您无需考虑。
当你reserveCapacity,这告诉 Swift 你预计数组最终会是这个大小,所以它应该提前为你准备好内存。它本质上只是您通常不需要进行的性能优化,除非您知道数组最终会增长到给定的大小。这并不意味着数组现在已经用值初始化了这个内存,因此访问越界元素会导致崩溃。
如果你想要一个预先用值初始化的数组,你可以像这样使用init(repeating:count:) 初始化器:
var arr = Array(repeating: 0, count: 10000)
这都将10,000元素分配存储空间,并初始化每个值0,所以现在你可以在这个范围内访问任何指标安全。