2013-02-17 49 views
5

我正在使用本書的幫助Game Engine Architecture的內存管理工作。 目前我正在閱讀關於內存對齊方面的內容(在本書和網頁中),我不確定如何正確使用類對齊。我理解內存對齊的概念(例如,一個4字節的數據塊應該位於以0x0,0x4,0x8或0xC結尾的地址),但是在本書中的allocateAligned()-函數中有一個註釋,表示對齊必須是兩個冪。如果我有一個班級有兩個int和一個charsizeof(classs)告訴我,該班級是12個字節大。那麼,你會通過32作爲對齊?它不會浪費記憶,也可能導致分裂?
我的問題是,類必須如何正確對齊,你能否更詳細地解釋我(如果你想對齊更大的數據塊,如121字節會發生什麼情況),並且它是否有意義使更大的塊被對齊(因爲處理器在一次調用中只取8個字節,如果我知道的話)?類的內存對齊

+0

16也是兩個冪。 – chepner 2013-02-17 19:19:32

+0

我從來沒有聽說過兩條規則的這種力量。我最近在類中學習了對齊方式,看起來類應該是12個字節(填充以匹配'int'的大小)。 – gsingh2011 2013-02-17 19:20:51

+0

*對齊*是2的冪,但* size *不是。 – 2013-02-17 19:22:02

回答

6

類型的對齊不能大於類型的尺寸。這是因爲在數組中,元素之間不可以有填充。

同樣重要的是,一種類型的對齊可能比該類型的尺寸小較小。我們考慮你的類類型:它有三個成員,兩個4字節整數和一個2字節整數。我們假設4字節整數的對齊方式是4字節,2字節整數的對齊方式是2字節(這很常見)。在這種情況下,類類型的對齊方式只有4個字節。它可以位於任何4字節的邊界上,並且每個成員都將正確對齊。

這就是爲什麼你的類類型有兩個字節的填充:12可以被4整除,但10不可以。如果你的類沒有填充,它的大小將只有10個字節,而在一組元素中,一半的對象將會錯位。

+0

如果我有一個類實例成員是12字節大的類會發生什麼? – immerhart 2013-02-17 19:22:25

+0

@immerhart:對齊仍然可能是四個字節。更大/更嚴格的對齊只是由陌生人數據類型引起的(可能是'long double'?),而不是通過將成員填充到'struct'中。 – aschepler 2013-02-17 19:26:39

+0

@immerhart:在這種情況下,該類型的對齊將是1個字節,2個字節或4個字節中的一個(這些是12的因子是2的冪)。 – 2013-02-17 19:29:54

1

類型的對齊可以小於,但不能大於其大小。在一個典型的32位實現,你

struct X { 
    int a; 
    int b; 
    char c; 
}; 

很可能有sizeof(X) == 12alignof(X) == 4。顯然,你不能有一個X每四個字節,因爲他們會再重疊,但對準意味着0x10000x10040x10080x100c可能開始一個X所有可能的地方。

注意,如由sizeof返回的類型大小總是對準的倍數,因爲sizeof指定陣列元件之間的字節數,並且你不希望在一個陣列中的第一項要對齊,但不是第二。