日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【原译】简单的Malloc实现

發布時間:2025/7/14 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【原译】简单的Malloc实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

免責申明(必讀!):本博客提供的所有教程的翻譯原稿均來自于互聯網,僅供學習交流之用,切勿進行商業傳播。同時,轉載時不要移除本申明。如產生任何糾紛,均與本博客所有人、發表該翻譯稿之人無任何關系。謝謝合作!

原文鏈接地址:http://os-blog.com/basic-malloc-implementation/

? ?已經有很多不同的,很強大的malloc的具體實現,比如tcmalloc,?ptmalloc,?dlmalloc, and?jemalloc,但是,在我們不加思索的使用這些之前,考慮一下如果實現一個基本的簡單的malloc函數是非常有用的。

?現在,一般來說,我們可以實現malloc使得對malloc的調用將會被映射到系統調用sbrk上,sbrk(n)將會移動程序中斷的位置-也就是程序的data段的最后。-偏移n個字節,這意味著,n個字節的內存就被分配給了當前程序

我們最終的實現大概看起來會像這樣

void* malloc (unsigned n)
{
return sbrk(n);
}

?

然而,調用一次sbrk是非常昂貴的。因此,如果我們的malloc實現,通過一次sbrk調用分配到了一塊很大的內存塊,當需要的時候再把這塊內存分成更小的部分,相比不論什么時候需要分配了就去調用malloc,將會更加高效一些。

記住,當申請到的內存已經用完的時候,malloc將不得不調用一次sbrk,此時,新申請到的大塊內存將和原來的大塊內存不是連續的。

另外,我們將會想要重新使用那些我們已經釋放的內存,因此我們的malloc實現應該保持記錄當前對程序可用的內存。由于一段時間后,這些可用的小的內存塊將不再連續,我們將會使用一個鏈表保持記錄這些可用的內存塊。

?

最后,我們需要記錄在我們的鏈表中,每一小塊可用的內存有多大,我們給我們的鏈表結構添加一個size域

把上面所有的結合起來,最終,這就是一個簡單的malloc的實現。

#define MINIMUM 1024 /*通過sbrk分配的最小內存 */

struct header {
struct header* next; /* 指向下一個節點的指針 */
unsigned size;
}

static header base; /* 鏈表頭 */
static header* freep = NULL; /* 空閑內存的鏈表 */

void* malloc (unsigned n)
{
header* p, *prev;
unsigned nunits;

nunits = (n + sizeof(header) - 1) / sizeof(header);
/* 檢查是否還有有空閑內存的鏈表 */
if ((prev = freep) == NULL) {
base.next = freep = prev = &base;
base.size = 0;
}

for (p = prev->next; ; prev = p, p = p->next) {
/* 空間的內存是否足夠? */
if (p.size >= nunits) {
if (p->size == nunits) /* 如果夠? */
prev->next = p->next;
else { /* 不夠就分配不夠的部分 */
p->size -= nunits;
p += p->size;
p->size = nunits;
}
freep = prev;
return (void *)(p + 1);
}

if (p == freep) /* wrapped around list */
if ((p = moremem(nunits)) == NULL)
return NULL; /* 沒有空內存 */
}
}

/* 從內核中請求更多的內存 */
header* moremem (unsigned n)
{
char* p;
header* up;

if (n < MINIMUM)
n = MINIMUM;

p = sbrk(n * sizeof(header));

if (p == (char *) -1) /* 沒有空閑內存 */
return NULL;

up = (header *) p;
up->size = n;
free((void *)(up + 1));

return freep;
}


這就是這個函數的要點了,我就不麻煩的實現free(n)了,但是free函數所做的僅僅是把n字節大小的空間插入到鏈表freep適當的地方就可以了

著作權聲明:本文由http://www.cnblogs.com/lazycoding翻譯,歡迎轉載分享。請尊重作者勞動,轉載時保留該聲明和作者博客鏈接,謝謝!

轉載于:https://www.cnblogs.com/lazycoding/archive/2012/01/02/2310409.html

總結

以上是生活随笔為你收集整理的【原译】简单的Malloc实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。