2017-12-02 24 views
3

在Swift 4中,MemoryLayout結構告訴您size,stridealignment的一個類型。Swift中的對齊vs跨步

我理解尺寸和步幅,但不是真的對齊。

是否有例如顯示對齊是什麼,它是如何從不同的步幅,當它已經從步幅不同的值,並且它是不正確的使用步伐,但正確使用對齊?

我可以總是從另一個計算一個嗎?

+1

你見過https://github.com/apple/swift/blob/master/docs/ABI/TypeLayout.rst嗎? –

+2

如果您瞭解步幅以及尺寸和步幅之間的差異,則應該已經知道對齊方式,因爲步幅通常是需要對齊的結果。並且在幾個處理器上對齊(在x字節邊界上,取決於類型的大小)是必要的,以便更快地訪問某些類型。 –

+0

@JoshCaswell謝謝你!我沒有意識到這一點。這是一個非常有用的鏈接。 – algal

回答

5

下面是一個簡單的例子:

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中聲明順序。對於每個字段:通過上舍入到對準的字段 ,也就是說,它增加對至少值大於或 等於尺寸和整除由場的取向
    • 更新大小。
    • 將字段的偏移量指定爲當前的大小值。
    • 更新 大小通過添加字段的大小。
    • 將對齊更新爲對齊的最大值和對齊字段。
  • 最終大小和對齊 是聚合的大小和對齊。該類型的步幅是 最終大小向上取整。
+2

我把它打印(數據)語句的輸出的每個4字節組中顯示的最後一個字節是垃圾填充字節? (<010002 ** 34 ** 030004 ** 74 ** 050006 ** 6f **>中的粗體數字)。 –

+0

此外,我收集您假設小端字節順序? –

+1

@DuncanC:是的,填充字節的內容是未指定的。 - 大小/對齊/步幅不取決於字節順序,所以我不假設任何東西。 *示例*不過是小端的 - 這並不奇怪,因爲所有當前的macOS和iOS平臺都是小端的。 –