我也想知道glibc malloc()是否做到這一點。什麼是對齊的內存分配?
回答
Alignment要求指定哪些地址偏移量可以分配給哪些類型。這完全取決於實現,但通常基於字大小。例如,一些32位體系結構要求所有變量都以4的倍數開始。在某些體系結構中,對齊要求是絕對的。在其他人(例如x86)上嘲諷他們只會帶來性能損失。
malloc
需要返回適合任何對齊要求的地址。換句話說,返回的地址可以分配給任何類型的指針。從C99§7.20.3(存儲器管理功能):
指針返回如果分配成功 適當地對準,使得它 可以被分配給一個指向任何 類型的對象,然後用於訪問 這樣的對象或者這樣的對象的數組在分配空間中的對象(直到 空間被明確地解除分配)。
如果你有特別的記憶alignemnt需要(特定的硬件或庫),你可以檢查出非便攜式內存分配,如_aligned_malloc()
和memalign()
。這些可以很容易地在「便攜式」界面後面抽象出來,但不幸的是非標準。
假設你有結構。
struct S {
short a;
int b;
char c, d;
};
沒有對準,這將在內存中排列這樣(假設32位體系結構):
0 1 2 3 4 5 6 7
|a|a|b|b|b|b|c|d| bytes
| | | words
的問題是,在某些CPU架構中,指令加載4內存中的字節整數僅適用於字邊界。所以你的程序必須用單獨的指令來獲取b
的每一半。
但如果記憶被佈置爲:
0 1 2 3 4 5 6 7 8 9 A B
|a|a| | |b|b|b|b|c|d| | |
| | | |
然後訪問b
變得簡單。 (缺點是需要更多的內存,因爲填充字節。)
不同的數據類型有不同的對齊要求。是很常見的char
爲1字節對齊,short
爲2字節對齊,以及4字節的類型(int
,float
,和在32位的系統指針)是4字節對齊。
malloc
是C標準所要求的,用於返回一個針對任何數據類型正確對齊的指針。
x86-64上的glibc malloc
返回16字節對齊的指針。
非常好的解釋,確實如此。 – AnyOneElse 2013-08-22 12:53:23
很好的解釋。 – hagrawal 2016-01-31 22:36:35
對不起,我不知道你的意思是什麼「char是1字節對齊,短爲2字節對齊和4字節類型」是常見的。 – 2016-11-19 07:42:30
的malloc()
文件說:
[...] the allocated memory that is suitably aligned for any kind of variable.
這是在C很多要做的事情/ C++實現。但是,正如其他人所指出的,存在許多特殊情況並需要特定的對齊。例如,英特爾處理器支持256位類型:__m256
,這肯定不會被malloc()
考慮在內。類似的,如果你想爲要分頁的數據分配一個內存緩衝區(類似於mmap()
等返回的地址),那麼你需要一個可能非常大的對齊,如果malloc()
是返回始終與這些邊界對齊的緩衝區。
在Linux或其他Unix系統,我建議你使用posix_memalign()
功能:
int posix_memalign(void **memptr, size_t alignment, size_t size);
這是一個想要使用這種需求的最新功能。
- 1. boost :: shared_array和對齊的內存分配
- 2. 如何分配4K對齊的內存
- 3. 讓std :: vector分配對齊的內存
- 4. Java的內存分配對齊
- 5. Win32內存分配與大對齊
- 6. 分配32字節對齊內存的分配器
- 7. 在堆上分配的內存塊是否保證了對齊?
- 8. 「內存是8字節對齊」是什麼意思?
- 9. 什麼意思是「緩存線對齊」?
- 10. 緩存對齊英特爾CPU上的內存分配
- 11. 爲什麼BitmapData.copyPixels會分配內存?
- 12. 對象的內存分配
- 13. 先前分配對象的內存會發生什麼?
- 14. 你對分配內存的函數有什麼命名約定?
- 15. 對於C++分配器,std :: align_val_t有效的對齊值是什麼?
- 16. SSE2 - 16字節對齊的內存動態分配
- 17. 如何使tr1 :: array分配對齊的內存?
- 18. 非齊次數組的內存分配是如何工作的?
- 19. 使用pci_alloc_consistent分配內存的限制是什麼?
- 20. 什麼是測量Windows內存分配的好工具?
- 21. PDF內存分配背後的祕密是什麼(CGPDFDocumentRef)
- 22. 「......的字節分配內存不足」是什麼意思? (Android)
- 23. 什麼是適合中型內存分配的大小?
- 24. iPhone:Xcode,樂器,內存分配。什麼是合理的?
- 25. g ++在堆棧上分配未使用的內存是什麼?
- 26. 什麼是副作用?爲什麼內存分配不是副作用?
- 27. 爲類型化內存視圖分配內存的建議方式是什麼?
- 28. 什麼是內核部分不匹配?
- 29. 爲什麼虛擬內存分配是遠遠高於居民的內存分配更高的解釋語言
- 30. 對齊不包括對齊分配
不會是目標架構的依賴嗎?它幾乎肯定是一致的... – 2010-10-22 05:06:40