對齊malloc
是posix_memalign
,沒關係,但對齊的realloc
呢? realloc
是否保留對齊方式或如何確保重新分配的內存具有相同的對齊方式?假設Linux和x86_64。是否realloc保持posix_memalign的內存對齊?
回答
否,從posix_memalign
返回的存儲器上的realloc
不能由ISO或POSIX保證保持相同的對齊。 A realloc
可能只是在同一地址展開當前塊,但它也可能將塊移到一個不同於原始對齊的不同地址。
如果你想要相同的對齊,最好分配另一個塊並複製數據。
不幸的是,在單一UNIX規範中也沒有posix_memalign_realloc
函數。
如果你不想去通過複製數據每時間的麻煩,你可以試試realloc
(一),如果不符合預期的,對準,然後,然後才請致電posix_memalign
以獲得正確對齊的地址並將數據複製到那裏,完成後釋放舊地址。
這可能導致:
- 零個拷貝(如果當前塊可以就地進行擴展);
- 一個副本(如果
realloc
副本,但恰好給你一個正確對齊的塊);或 - 兩個副本(如果
realloc
副本,然後你還必須複製,由於錯位)。
它可能根據底層的內存管理實現也會導致比指示更少的複製。例如,「複製」可能只涉及重新映射內存塊,而不是物理地移動數據。
所以你可能想保留一些統計數據,看看這個方案是否值得。
(一)請記住,無論是POSIX也不Linux手冊頁指定與否,你甚至可以傳遞這些指針realloc
,只是你可以將它們傳遞給free
。
然而,基於當前的GNU庫的源代碼,它似乎工作,雖然這並不能保證它會繼續在今後的工作中:-)
我擔心的是,它通常會分配內存(標準對齊)並且傳遞一個偏移地址(即,不是分配的實際地址,而是一個超出該地址的字節),其中free
足夠智能以在編譯它的魔法之前變回實際地址。
這樣做的一種方法是將實際地址存儲在返回地址之前,儘管這當然會導致即使對於正常分配也會造成浪費。
在這種情況下,free
可能已經做出智能(因爲規格說,它必須能夠處理由posix_memalign
所做的分配),但realloc
可能沒有被賦予相同的智能(由於文檔是對此事沉默)。
但是,基於GNU glibc 2.14.1,它實際上分配了比所需內存更多的內存,然後與場地一起擺弄前置空間和後置空間,以便返回的地址是「真實」地址,可由free
或realloc
使用。
但是,如上所述,文檔不能保證這一點。
這個答案在一個重要方面不正確:即使內存區域移動,realloc通常也不會複製。我認爲如果當前內存地址沒有足夠的空間來擴展緩衝區 - 頁面會被重新映射以避免複製。所以它會是零份,零份,一份。 – 2016-05-05 21:16:15
@RafaelBaptista,你在*標準中混淆了一些*實現*。*標準(ISO/POSIX)中沒有任何*規定了如何在封面下發生。然而,在我回答假設Linux將這個領域縮小了一點之後(但是由於Linux運行在各種各樣硬件上,並且MMU選項可能非常多樣),這個問題似乎已經改變了。將調整答案以適應。 – paxdiablo 2016-05-06 02:22:54
realloc與malloc行爲相同,因此realloc返回的內存具有與malloc相同的對齊約束。
如果您查看realloc的glibc源代碼,它會直接調用malloc。所以內存和malloc一樣。
對不起,我應該補充。在源代碼中,如果原始malloc'd內存已經指向的位置有額外的堆空間,那麼它只是在原始分配大小末尾分配額外的堆而不調用malloc。這顯然不會改變路線。 – 2012-01-31 10:58:58
- 1. 是否_PyString_Resize realloc內存?
- 2. 在堆上分配的內存塊是否保證了對齊?
- 3. 內存對齊保證
- 4. posix_memalign是否捕獲信號?
- 5. HTML/CSS對齊(內聯,水平)並保持右對齊
- 6. 將單元格中心內的內容對齊,但保持文本左對齊
- 7. 真的沒有realloc()支持對齊的版本嗎?
- 8. 保持div頂部對齊樹,而不是巢級別對齊
- 9. 是否可以在MySQL編輯器中保持對齊/列表?
- 10. ClojureBox是否支持自動對齊框?
- 11. malloc會保證內存對齊嗎?
- 12. Handlebars.js - 保持值列對齊
- 13. 什麼是對齊的內存分配?
- 14. 內容對齊的列保持最後一個div對齊底部?
- 15. valarray是否有連續的內存對齊?
- 16. 內存對齊與頁面對齊
- 17. 類的內存對齊
- 18. 預取對齊的內存
- 19. Java是否將內存中的類保留或只是對象?
- 20. ASP.NET PostBack是否保持內容安全
- 21. Seq.groupBy是否在組內保持順序?
- 22. libC++是否保持內部狀態?
- 23. CFRetain是否保持橋接的ObjC對象存活?
- 24. 如何知道編譯器是否執行內存對齊?
- 25. 如何使用這個宏來測試內存是否對齊?
- 26. asprintf覆蓋內存realloc
- 27. 動態內存:malloc和realloc
- 28. 如何保持頂部的內容對齊
- 29. 如何中心多列的內容保持左對齊列
- 30. DIV內容移動需要保持對齊的權利
不適用 - 如果您需要特殊的對齊方式,例如對於SIMD數據,則不要使用realloc。 – 2012-01-31 10:52:59
所以,如果我需要「對齊realloc」,我必須釋放和posix_memalign新的記憶,對吧? – Cartesius00 2012-01-31 10:54:10
是的 - 如果你真的想,你甚至可以實現你自己的'posix_memrealloc'。 – 2012-01-31 10:55:45