【发布时间】:2023-03-09 20:23:01
【问题描述】:
对不起,如果问题可能重复,我在这里找不到,也无法使用谷歌。
我是不安全的 Swift 新手,我想知道为什么布尔数组的大小(例如 10 个字节)仍然是 8 个字节?
如果我不能说出我的意思,我想知道你是否可以看看这段代码:
var boolArray = [Bool]()
for _ in 1...10{
boolArray.append(true)
}
print(MemoryLayout.size(ofValue: boolArray))
我不明白为什么它打印 8 而数组有 10 个至少包含 10 个字节的布尔值。
【问题讨论】:
-
无关但有用:您可以将数组生成缩短为
Array(repeating: true, count: 10)或者如果您正在处理类并想要 10 个不同的对象:(1...10).map { _ in YourClass() } -
@LeoDabus 你是最好的一种权利 - 技术上正确
-
@ParsaNoori 从技术上讲,您甚至不能在现代 CPU 上加载比缓存行少的任何东西。但是您仍然可以访问成分。虽然您不能单独加载单个位,但您可以加载整个字节,屏蔽除您要查找的位之外的所有位,然后读取它。
-
@ParsaNoori 由于每个字节有 8 位,您可以使用索引的最后 3 位以外的所有位来选择要查看的字节,并使用最后 3 位来编码你感兴趣的位。例如,如果您想要索引 59 处的
Bool(二进制中的0b111011),则查看第 7 个字节(0b111)。假设那个字节的值是0b11111111(全是“真”)。我们关心位 3 (0b011),所以我们通过与掩码0b00000100进行与运算来掩码0b1111111。结果是0b00000100,表示设置了第3位。 -
@ParsaNoori 如果该字节的值为
0b11111011,在用0b00000100屏蔽后,我们将得到0x00000000,这意味着第3 位已关闭。
标签: arrays swift unsafe memory-layout