Swift 斯威夫特的回忆

Swift 斯威夫特的回忆,swift,struct,swift4,memory-layout,Swift,Struct,Swift4,Memory Layout,MemoryLayout如何计算结构的大小 我读了这篇文章,似乎理解得很好,直到我陷入了以下问题: struct CertifiedPuppy1 { let age: Int let isTrained: Bool let isCertified: Bool } MemoryLayout<CertifiedPuppy1>.size // 10 MemoryLayout<CertifiedPuppy1>.stride // 16 Mem

MemoryLayout如何计算结构的大小

我读了这篇文章,似乎理解得很好,直到我陷入了以下问题:

struct CertifiedPuppy1 {
  let age: Int
  let isTrained: Bool
  let isCertified: Bool
}

MemoryLayout<CertifiedPuppy1>.size        // 10
MemoryLayout<CertifiedPuppy1>.stride      // 16
MemoryLayout<CertifiedPuppy1>.alignment   // 8

struct CertifiedPuppy2 {
  let isTrained: Bool
  let age: Int
  let isCertified: Bool
}

MemoryLayout<CertifiedPuppy2>.size        // 17
MemoryLayout<CertifiedPuppy2>.stride      // 24
MemoryLayout<CertifiedPuppy2>.alignment   // 8


struct CertifiedPuppy3 {
  let isTrained: Bool
  let isCertified: Bool
  let age: Int
}

MemoryLayout<CertifiedPuppy3>.size        // 16 <--why not 10, like for CertifiedPuppy1 ??--
MemoryLayout<CertifiedPuppy3>.stride      // 16
MemoryLayout<CertifiedPuppy3>.alignment   // 8
struct CertifiedSupply1{
年龄:Int
让我训练一下:布尔
让我们证明:布尔
}
MemoryLayout.size//10
MemoryLayout.stride//16
MemoryLayout.alignment//8
结构认证供应商2{
让我训练一下:布尔
年龄:Int
让我们证明:布尔
}
MemoryLayout.size//17
MemoryLayout.stride//24
MemoryLayout.alignment//8
结构认证供应商3{
让我训练一下:布尔
让我们证明:布尔
年龄:Int
}

MemoryLayout.size//16据我所知,基本上有一条主要规则:

  • 每个对象的起始地址必须是其对齐方式的倍数。该规则适用于所有内容—结构中的属性(Int、Bool等)、结构本身以及所有其他类型
下图显示了示例的字节布局

让我们看看您的最后一个示例-CertifiedSupply3:
-isTrained(Bool)的对齐为1,这意味着它可以从任何地址开始,因此它从0开始。
-isCertified(Bool)的对齐也是1,因此isCertified从1开始没有问题。
-年龄对齐(Int)为8,因此只能从0、8、16、24开始。。。这就是为什么起始地址是8岁,而不是2岁。如果它是在2,它将失调

因此CertifiedSupply3的大小为16,因为其属性必须遵循对齐规则

与问题无关的还有:

  • 结构的对齐方式等于其属性的最大对齐方式
这就是为什么CertifiedSupply2的步幅是24:CertifiedSupply2的对齐是8,因为它的大小是17,新CertifiedSupply2对象开始的下一个可用位置是24-这就是步幅-两个CertifiedSupply2对象之间的最小距离


每个
Int
与8字节边界对齐,大小为8。可能有用:。啊,您的意思是CertifiedSupply1:8+1+1+(缓冲区6,忽略)=10;认证供应3:1+1+(缓冲区6,计数)+8=16