Swift中的对齐vs跨步
在Swift 4中,MemoryLayout
结构告诉您size
,stride
和alignment
的一个类型。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的是其所有 字段的最大比对,在此情况下,最大的
2
和1
。 - 该结构的跨步是四舍五入对齐的大小, 这里
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