c++在很多地方都採用了對其分配記憶體的方式,比如乙個類物件資料成員的存放就按照對齊方式存放。對齊有利於訪問效率的提高:比如有些平台每次讀取資料都是從偶數字址開始,若乙個int型存放在偶數字址開始處,則一次讀週期就可以讀出這個整數,而如果存放在奇數字址處,則需要兩個讀週期。標準庫提供的malloc和free並沒有對齊的要求,需要的時候,我們可以自己實現乙個對齊分配的malloc和free。
分配記憶體的時候需要多分配一些空間用以調整指標的開頭,使得指標的位址是對齊的。同時注意要在對齊指標的前面「額外」的空間中存放malloc實際分配得到的位址,等下釋放記憶體空間的時候需要用此位址來釋放。而且必須同時編寫自己的記憶體釋放函式,如果將對齊的位址直接傳給標準的free()函式,將出現不確定的行為。
void*aligned_malloc(size_t required_bytes, size_t alignment)p2 = (void**)(((size_t)(p1)+offset) & ~(alignment - 1
)); p2[-1] =p1;
return
p2;}
void aligned_free(void *p2)
對malloc分配的資源做記憶體對齊
記憶體對齊效能原因 資料結構 尤其是棧 應該盡可能地在自然邊界上對齊。原因在於,為了訪問未對齊的記憶體,處理器需要作兩次記憶體訪問 而對齊的記憶體訪問僅需要一次訪問。個人的一點說明 在c c 中,使用malloc 動態分配的記憶體是隨機的,如果要對分配的這段記憶體運算比較頻繁,可能有效能上的問題,同...
malloc分配空間的問題
include h include h int main memset p,0,sizeof p 使陣列中的每個值首先都為0 p 0 0 1 sum 1 x 0 y 0 while sum 按照蛇形賦值 printf 輸出n階矩陣 n for i 0 iprintf n goto loop retu...
記憶體分配位址的對齊
void memalign size t boundary,size t size 看nginx源 中的實現 define ngx align d,a d a 1 a 1 返回的位址值為d後第乙個是a的整數倍的值。a是2的整數次冪。假設a 2 n,即a的二進位制表示中末尾有n個0。假設返回的結果為a...