为什么swift结构中的变量UInt8的偏移量为2?但是,仅UInt8s的结构显示的偏移量为1?
struct Test {
let a: UInt8
let b: UInt16
}
MemoryLayout<Test>.offset(of: \Test.a) // 0
MemoryLayout<Test>.offset(of: \Test.b) // 2 (not 1)
struct Test2 {
let a: UInt8
let b: UInt8
let c: UInt8
}
MemoryLayout<Test2>.offset(of: \Test2.a) // 0
MemoryLayout<Test2>.offset(of: \Test2.b) // 1
MemoryLayout<Test2>.offset(of: \Test2.c) // 2
答案 0 :(得分:1)
这与Swift如何在内存中对齐属性有关。对于第一个结构,alignment
为2,而第二个结构的对齐方式为1。
您在Test
中的属性不会存储在内存中,它们像这样打包在一起:
x y y
其中x
代表a
的字节,而y
代表b
的字节。
它看起来像这样:
x y y
请注意x
之后的填充。
我要在此处说明的要点是,Swift将一部分内存划分为“切片”,以放入您的结构的属性。这些相等的切片必须能够包含您的所有属性。这就是为什么在Test
中,必须将内存切成2个字节的片以容纳在UInt16
中的原因。
但是在Test2
中,将内存切成1个字节的片足以容纳UInt8
。
此“每个切片有多少个字节”数字是alignment
。
有关Swift为什么以这种方式减少内存的内容,请阅读this。