Swift 中 MemoryLayout.size 中数组的大小

Par*_*ori 3 arrays unsafe memory-layout swift

抱歉,如果问题可能重复,我既无法在此处找到,也无法使用 Google。

我是不安全 Swift 的新手,我想知道为什么 Bools 数组的大小(例如 10 个字节)仍然是 8 个字节?

如果我不能说出我的意思,我会想知道你是否可以看看这段代码:

var boolArray = [Bool]()
for _ in 1...10{
    boolArray.append(true)
}
print(MemoryLayout.size(ofValue: boolArray))
Run Code Online (Sandbox Code Playgroud)

我不明白为什么它打印 8 而数组有 10 个至少包含 10 个字节的 bool。

mag*_*zbc 5

那是因为一个 Array本身并不真正存储任何东西——在内部,它们持有对堆分配的内存块的引用,这块内存真正存储数据。

这样做的原因之一是优化 - 它允许使用写时复制机制。Array是 a struct,因此它是一种值类型。然而,它所持有的数据不需要每次复制时都复制Array——相反,多个Arrays可以指向同一内存区域,只要它们不修改它。

  • 可以合理地猜测表示“Array”*container*”的数据结构有 8 个字节长。这是一种不透明的结构,只有语言设计者才感兴趣。 (2认同)