Swift中的对齐vs跨步

在Swift 4中,MemoryLayout结构告诉您size,stridealignment的一个类型。Swift中的对齐vs跨步

我理解尺寸和步幅,但不是真的对齐。

是否有例如显示对齐是什么,它是如何从不同的步幅,当它已经从步幅不同的值,并且它是不正确的使用步伐,但正确使用对齐?

我可以总是从另一个计算一个吗?

回答:

下面是一个简单的例子:

struct Foo { 

let a: Int16

let b: Int8

}

print(MemoryLayout<Foo>.size) // 3

print(MemoryLayout<Foo>.alignment) // 2

print(MemoryLayout<Foo>.stride) // 4

  • 对准struct的是其所有 字段的最大比对,在此情况下,最大的21
  • 该结构的跨步是四舍五入对齐的大小, 这里3四舍五入为4的倍数。

跨距是(开始)在存储器中的相同类型的连续实例之间的距离:

let array = [Foo(a: 1, b:2), Foo(a: 3, b: 4), Foo(a: 5, b: 6)] 

array.withUnsafeBytes {

print(Data($0) as NSData) // <01000234 03000474 0500066f>

print($0.count) // 12

}

的结构步幅是结构对准的倍数,使得 所有实例(因此所有实例字段)都正确对齐。

的细节可以在 Type Layout发现:

脆弱的结构和元组布局

结构体和元组目前使用相同的布局算法,指出作为“万能”布局算法编译器实现。该算法如下:

  • 开始的大小为0和1
  • 迭代通过 字段的元组为 结构的对准,在元件顺序,或在var中声明顺序。对于每个字段:通过上舍入到对准的字段 ,也就是说,它增加对至少值大于或 等于尺寸和整除由场的取向

    • 更新大小。
    • 将字段的偏移量指定为当前的大小值。
    • 更新 大小通过添加字段的大小。
    • 将对齐更新为对齐的最大值和对齐字段。
  • 最终大小和对齐 是聚合的大小和对齐。该类型的步幅是 最终大小向上取整。

以上是 Swift中的对齐vs跨步 的全部内容, 来源链接: utcz.com/qa/257641.html

回到顶部