內存管理基本技術之:塊頭
版權聲明:
本文章由vt.buxiu發佈在www.vtzone.org
@內容摘要:塊頭指用來記錄內存管理相關信息的內存塊,通常位於普通內存塊的頭部和尾部。@,版權歸vtzone研究小組所有,轉載請保持此聲明!!!
塊頭大多數分配器在每一塊頭保存一些有用信息,更準確的說是保存快的大小。因爲大多數標準分配器<比如CLib>釋放內存時並不要求應用傳遞一個大小信息。
上圖的塊頭的應用是一個最簡單而用常用的用法,假定內存分配器提供兩個函數mymalloc和myfree,這兩個函數原形與C標準庫的malloc和free相同:
應用程序每次向分配器請求內存的時候,分配器將一塊內存block返回給應用程序,同時在其頭部維護一個header
其他一些信息,比如,塊是否被使用,與相鄰塊之間的關係等也可能保存在頭部。如下圖則是由Knuth提出的邊界標記算法中使用的,該內存塊保存了兩個信息:塊頭和塊尾,而頭合尾分別保存了內存塊的大小和是否被佔用標誌。保存這些塊頭信息是爲了快速的進行分配和釋放操作。
關於上圖的具體應用以及代碼示例請參考<邊界標記>。
需要明確的是,頭塊很方便但浪費空間,當小對象請求時表現更加明顯。根據[WJNB95],應用程序請求內存的平均大小爲10Bytes,如果這個假設成立,每個塊頭如果佔用4Bytes,使用一個塊頭的內存管理則造成4/10的內存浪費。當然如果使用的塊頭不是4bytes或者更大浪費則更多。當然10bytes只是一個平均值,對於特定的應用程序,可以評估自己特定應用的平均請求的內存塊的大小而做出抉擇。
作者:[email protected]
本文章由vt.buxiu發佈在www.vtzone.org
@內容摘要:塊頭指用來記錄內存管理相關信息的內存塊,通常位於普通內存塊的頭部和尾部。@,版權歸vtzone研究小組所有,轉載請保持此聲明!!!
塊頭大多數分配器在每一塊頭保存一些有用信息,更準確的說是保存快的大小。因爲大多數標準分配器<比如CLib>釋放內存時並不要求應用傳遞一個大小信息。
上圖的塊頭的應用是一個最簡單而用常用的用法,假定內存分配器提供兩個函數mymalloc和myfree,這兩個函數原形與C標準庫的malloc和free相同:
應用程序每次向分配器請求內存的時候,分配器將一塊內存block返回給應用程序,同時在其頭部維護一個header
由於當應用調用free(void* address)時候並未指定釋放的大小,分配器由free指定的地址向前偏移一個header大小就能夠獲取保存在header中的該內存塊的size信息。
其他一些信息,比如,塊是否被使用,與相鄰塊之間的關係等也可能保存在頭部。如下圖則是由Knuth提出的邊界標記算法中使用的,該內存塊保存了兩個信息:塊頭和塊尾,而頭合尾分別保存了內存塊的大小和是否被佔用標誌。保存這些塊頭信息是爲了快速的進行分配和釋放操作。
關於上圖的具體應用以及代碼示例請參考<邊界標記>。
需要明確的是,頭塊很方便但浪費空間,當小對象請求時表現更加明顯。根據[WJNB95],應用程序請求內存的平均大小爲10Bytes,如果這個假設成立,每個塊頭如果佔用4Bytes,使用一個塊頭的內存管理則造成4/10的內存浪費。當然如果使用的塊頭不是4bytes或者更大浪費則更多。當然10bytes只是一個平均值,對於特定的應用程序,可以評估自己特定應用的平均請求的內存塊的大小而做出抉擇。
作者:[email protected]
複製內容到剪貼板
代碼:
void myfree(void* p)
{
void* pointer = (char*)p – sizeof(Header);
return free(pointer);
}
複製內容到剪貼板
代碼:
typedef unsigned long Header;
void* mymalloc (size_t size)
{
void* mem = malloc(size + sizeof(Header));
*((Header*)mem) = size;
return (char*)mem + sizeof(Header);
}