UInt8的Swift偏移量(of :)具有2个字节的偏移量

时间:2018-10-04 04:13:10

标签: swift

为什么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

1 个答案:

答案 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