一種巧妙的記憶體池演算法 HeapBlock

2021-06-07 21:11:05 字數 1139 閱讀 8457

在乙個簡單的gui庫中看到的演算法,非常巧妙,適用於需要頻繁分配和釋放相同大小資料塊的情況,如gui庫中的視窗結構,socket結構等,演算法額外開支極小。

[cpp]view plain

copy

print?

typedef

dword hblockheap; 

typedef unsigned char

byte, *pbyte; 

//使用之前需要先分配一整塊記憶體,並呼叫此函式進行初始化,初始化後將形成乙個鏈,只是這個鏈沒有前後指標,

//指標資料儲存在資料塊實體資料前4位元組中

hblockheap blockheap_initialize(void* buffer, int buffersize, int blocksize) 

*(pbyte*)pblock = null;//最後一塊的下一塊為空塊

return (hblockheap)buffer;//返回此鏈的首塊,此值需要呼叫者儲存

}  //從記憶體池中分配資料時,直接將鏈首返回給呼叫者,同時將鏈首指向的下一塊指定為新的鏈首

void* blockheap_alloc(hblockheap* pheap) 

//釋放時將要釋放的塊指定為新的鏈首,並指向原鏈首即可

void blockheap_free(hblockheap* pheap, void* pblock) 

//基本的呼叫示例

typedef

structsocket, *psocket; 

static socket s_sockets[100];    //先分配的記憶體

static hblockheap s_hsockets;    //儲存鏈首的變數

//初始化並得到鏈首

s_hsockets = blockheap_initialize(s_sockets, sizeof(s_sockets), sizeof(s_sockets[0])); 

//分配記憶體

socket *sock = blockheap_alloc(&s_hsockets); 

//其它操作...

//釋放記憶體

blockheap_free(&s_hsockets, sock); 

記憶體池的一種實現

include include include include include const.h include utilityfunc.h include hashtable.h include logmsg.h define system page size 4096 define default...

一種記憶體池的實現方法

大圖 這裡使用python的 來解釋 size 是呼叫者意欲分配的記憶體大小 def allocate size 如果這裡分配的大小大於了最大快取的size 直接通過malloc operatornew 申請 if size max pooled size use malloc or operato...

關於組合問題的一種巧妙方法

在演算法設計與分析裡,組合排列 或者表面像排列組合 的問題很好的解決方法主要是回溯法,廣度優先遍曆法。這裡提供關於組合問題一種巧妙的解決辦法。比如我們要從m個元素裡取n個元素的所有組合。我們用乙個m位二進位制數代表m個元素 一位代表乙個元素 取n個元素可以看做是這個m位二進位制數中有n位的值為1.乙...