在Swift 4中,MemoryLayout
結構告訴您size
,stride
和alignment
的一個類型。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
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中聲明順序。對於每個字段:通過上舍入到對準的字段 ,也就是說,它增加對至少值大於或 等於尺寸和整除由場的取向
- 更新大小。
- 將字段的偏移量指定爲當前的大小值。
- 更新 大小通過添加字段的大小。
- 將對齊更新爲對齊的最大值和對齊字段。
- 最終大小和對齊 是聚合的大小和對齊。該類型的步幅是 最終大小向上取整。
我把它打印(數據)語句的輸出的每個4字節組中顯示的最後一個字節是垃圾填充字節? (<010002 ** 34 ** 030004 ** 74 ** 050006 ** 6f **>中的粗體數字)。 –
此外,我收集您假設小端字節順序? –
@DuncanC:是的,填充字節的內容是未指定的。 - 大小/對齊/步幅不取決於字節順序,所以我不假設任何東西。 *示例*不過是小端的 - 這並不奇怪,因爲所有當前的macOS和iOS平臺都是小端的。 –
你見過https://github.com/apple/swift/blob/master/docs/ABI/TypeLayout.rst嗎? –
如果您瞭解步幅以及尺寸和步幅之間的差異,則應該已經知道對齊方式,因爲步幅通常是需要對齊的結果。並且在幾個處理器上對齊(在x字節邊界上,取決於類型的大小)是必要的,以便更快地訪問某些類型。 –
@JoshCaswell謝謝你!我沒有意識到這一點。這是一個非常有用的鏈接。 – algal