swift中带选项的结构尺寸

swift中带选项的结构尺寸,swift,memory,memory-management,Swift,Memory,Memory Management,调用的奇怪结果MemoryLayout.size。它在下面的结构上返回41 struct SampleStruct { var tt: Int? var qq: Int? var ww: Int? } 不能被3整除!同时,Int?的大小为9。它是怎样的?Int?aka可选是一种枚举类型,需要9个字节:8个字节用于整数(如果我们在64位平台上),另一个字节用于大小写鉴别器 此外,通过插入填充字节,每个整数在内存中与其自然(8字节)边界对齐 因此,您的结构在内存中看起来像这

调用的奇怪结果
MemoryLayout.size
。它在下面的结构上返回41

struct SampleStruct {
    var tt: Int?
    var qq: Int?
    var ww: Int?
}

不能被3整除!同时,
Int?
的大小为9。它是怎样的?

Int?
aka
可选
是一种
枚举
类型,需要9个字节:8个字节用于整数(如果我们在64位平台上),另一个字节用于大小写鉴别器

此外,通过插入填充字节,每个整数在内存中与其自然(8字节)边界对齐

因此,您的结构在内存中看起来像这样:

i1 i1 i1 i1 i1 i1 i1 i1      // 8 bytes for the first integer
c1 p1 p1 p1 p1 p1 p1 p1      // 1 byte for the first case discriminator,
                             // ... and 7 padding bytes
i2 i2 i2 i2 i2 i2 i2 i2      // 8 bytes for the second integer
c2 p2 p2 p2 p2 p2 p2 p2      // 1 byte for the second case discriminator
                             // ... and 7 padding bytes
i3 i3 i3 i3 i3 i3 i3 i3      // 8 bytes for the third integer
c3                           // 1 byte for the third case discriminator
总共有41个字节

如果
SampleStruct
值连续存储在数组中,则在元素之间插入额外的填充,以确保每个值从8字节边界开始。步幅考虑了额外的填充:

打印(MemoryLayout.size)//41
打印(MemoryLayout.stride)//48
您可以在Swift文档的文档中找到血淋淋的细节

print(MemoryLayout<SampleStruct>.size)    // 41
print(MemoryLayout<SampleStruct>.stride)  // 48