gpt4 book ai didi

Swift 偏移量(:) for UInt8 has 2 byte offset

转载 作者:行者123 更新时间:2023-11-28 05:51:55 27 4
gpt4 key购买 nike

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

最佳答案

这与 Swift 如何对齐内存中的属性有关。对于您的第一个结构,对齐 为 2,而您的第二个结构的对齐为 1。

Test 中的属性不会像这样打包在一起存储在内存中:

x y y

其中x代表a的一个字节,y代表b的一个字节。

看起来更像这样:

x   y y

注意 x 之后的填充。

我在这里想说明的一点是,Swift 将内存的一部分划分为“切片”以放入结构的属性。这些相等的切片必须能够包含您的所有属性。这就是为什么在 Test 中,必须将内存分成 2 个字节的片段,以适应 UInt16

然而,在 Test2 中,将内存分成 1 个字节的片段足以包含 UInt8

这个“每片多少字节”数字是对齐

为什么 Swift 以这种方式减少内存,请阅读 this .

关于Swift 偏移量(:) for UInt8 has 2 byte offset,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52638891/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com