Swift 斯威夫特的回忆
MemoryLayout如何计算结构的大小 我读了这篇文章,似乎理解得很好,直到我陷入了以下问题: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
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