我正在使用本書的幫助Game Engine Architecture的內存管理工作。 目前我正在閱讀關於內存對齊方面的內容(在本書和網頁中),我不確定如何正確使用類對齊。我理解內存對齊的概念(例如,一個4字節的數據塊應該位於以0x0,0x4,0x8或0xC結尾的地址),但是在本書中的allocateAligned()
-函數中有一個註釋,表示對齊必須是兩個冪。如果我有一個班級有兩個int
和一個char
,sizeof(classs)
告訴我,該班級是12個字節大。那麼,你會通過32作爲對齊?它不會浪費記憶,也可能導致分裂?
我的問題是,類必須如何正確對齊,你能否更詳細地解釋我(如果你想對齊更大的數據塊,如121字節會發生什麼情況),並且它是否有意義使更大的塊被對齊(因爲處理器在一次調用中只取8個字節,如果我知道的話)?類的內存對齊
Q
類的內存對齊
5
A
回答
6
類型的對齊不能大於類型的尺寸。這是因爲在數組中,元素之間不可以有填充。
同樣重要的是,一種類型的對齊可能比該類型的尺寸小較小。我們考慮你的類類型:它有三個成員,兩個4字節整數和一個2字節整數。我們假設4字節整數的對齊方式是4字節,2字節整數的對齊方式是2字節(這很常見)。在這種情況下,類類型的對齊方式只有4個字節。它可以位於任何4字節的邊界上,並且每個成員都將正確對齊。
這就是爲什麼你的類類型有兩個字節的填充:12可以被4整除,但10不可以。如果你的類沒有填充,它的大小將只有10個字節,而在一組元素中,一半的對象將會錯位。
1
類型的對齊可以小於,但不能大於其大小。在一個典型的32位實現,你
struct X {
int a;
int b;
char c;
};
很可能有sizeof(X) == 12
和alignof(X) == 4
。顯然,你不能有一個X
每四個字節,因爲他們會再重疊,但對準意味着0x1000
,0x1004
,0x1008
和0x100c
你可能開始一個X
所有可能的地方。
注意,如由sizeof
返回的類型大小總是對準的倍數,因爲sizeof
指定陣列元件之間的字節數,並且你不希望在一個陣列中的第一項要對齊,但不是第二。
相關問題
- 1. C++類內存對齊
- 2. 如何使內存對齊類的派生類失去對齊
- 3. Java類的內存對齊方式
- 4. 內存對齊與頁面對齊
- 5. 預取對齊的內存
- 6. C++內存對齊問題
- 7. 內存對齊保證
- 8. 內存對齊在C
- 9. CUDA:curand_uniform全局內存對齊
- 10. C - 內存對齊argv?
- 11. 內存對齊(用C專)
- 12. 內存對齊約束
- 13. 內存對齊錯誤2013
- 14. 內存地址對齊
- 15. 使用屬性對齊時的內存對齊(1)
- 16. dlmalloc中的內存對齊掩碼
- 17. malloc與newLib中對齊的內存
- 18. C++中的共享內存對齊
- 19. 如何對齊Objective C中的內存?
- 20. 內存對齊和結構的大小
- 21. 未對齊的內存訪問
- 22. Swift 3中的對齊內存
- 23. 與工會的內存對齊問題
- 24. C/C++中的內存對齊
- 25. 什麼是對齊的內存分配?
- 26. boost :: shared_array和對齊的內存分配
- 27. Malloc和未對齊的內存
- 28. 如何分配4K對齊的內存
- 29. 讓std :: vector分配對齊的內存
- 30. Java的內存分配對齊
16也是兩個冪。 – chepner 2013-02-17 19:19:32
我從來沒有聽說過兩條規則的這種力量。我最近在類中學習了對齊方式,看起來類應該是12個字節(填充以匹配'int'的大小)。 – gsingh2011 2013-02-17 19:20:51
*對齊*是2的冪,但* size *不是。 – 2013-02-17 19:22:02