obstacks是gun lib中實現的記憶體池,在基於gnu的系統中可以直接使用,想要深入了解gnu obstacks的可以參閱參考資料。
1. 建立obstacks
操作obstacks的所有函式都在定義在標頭檔案obstack.h中。
struct obstack
結構體strcut obstack代表乙個obstack,它並不包含物件本身,不應該直接訪問這個結構體的內容。
所有操作obstack的函式都需要指明使用哪個obstack,使用struct obstack*指明。
obstack中的物件被打包放在非常大的記憶體塊中,這些塊被稱作chunks,struct obstack中儲存有乙個指向正在使用的chunks鍊錶的指標。
一旦最後乙個chunk中空間不足時,obstack就會獲得乙個新的chunk。obstack會自動的管理chunks,所以你不需要關心他們,但你需要指出哪個obstack需要獲得乙個chunk。
2. 準備開始使用obstack
在每個需要使用obstack的原始檔中加入#include
使用obstack前必須初始化這個obstack,使用obstack_init
intobstack_init(struct obstack *obstack-ptr)
使用obstack_init前必須定義obstack_chunk_alloc和obstack_chunk_free。
#define obstack_chunk_alloc xmalloc
#define obstack_chunk_free free
3. 在乙個obstack上申請空間
最直接的方式是使用obstack_alloc
void *obstack_alloc(struct obstack *obstack-ptr, int size)
申請空間並填充內容,使用obstack_copy
void *obstack_copy(struct obstack *obstack-ptr, void *address, int size)
申請空間並使用address指向的記憶體填充
void *obstack_copy0(struct obstack *obstack-ptr, void *address, int size)
功能同上,區別是會在最後追加乙個'\0'
4. 釋放obstack中的物件
obstack_free,因為obstack中包含很多物件,釋放其中乙個會自動釋放同乙個obstack中在它之後建立的物件。
voidobstack_free(struct obstack *obstack-ptr, void *object)
如果object為空,那麼這個obstack中申請的所有空間都會被釋放。
需要注意的是,object為空指標時,obstack會成為乙個未初始化的obstack。想要釋放所有空間並且保留乙個有效的obstack,使用obstack_free釋放obstack中第乙個物件的位址,用法:
obstack_free (obstack_ptr, first_object_allocated_ptr);
5. 增長型物件
內存在obstack chunks中是連續的,這就讓一步一步建立乙個物件成為了可能,可以做到一點一點在這個物件最後新增乙個或多個位元組。你不需要提前知道你將要放入多少資料到這個物件中。我們稱這樣的技術為增長型物件。
增長型物件的真實位址只有在完成後才能知道。
當obstack正在用來建立乙個增長型物件時不可以用來建立普通物件。
下面是對growing object的操作函式:
voidobstack_blank(struct obstack *obstack-ptr, int size)
新增空白到growing object中
voidobstack_grow(struct obstack *obstack-ptr, void *data, int size)
新增已有資料growing object中
voidobstack_grow0(struct obstack *obstack-ptr, void *data, int size)
新增已有資料,並在最後新增 '\0'
voidobstack_1grow(struct obstack *obstack-ptr, char c)
新增乙個字元
voidobstack_ptr_grow(struct obstack *obstack-ptr, void *data)
新增乙個指標本身,大小為sizeof (void *)
voidobstack_int_grow(struct obstack *obstack-ptr, int data)
新增乙個int型變數,大小為sizeof(int)
void *obstack_finish(struct obstack *obstack-ptr)
完成乙個增長型物件,並返回最終位址。
intobstack_object_size(struct obstack *obstack-ptr)
返回乙個增長型物件當前大小,單位為byte。物件如果已經完成會返回0。
想要釋放乙個正在增長的物件,需要先完成它,然後釋放它,比如:
obstack_free (obstack_ptr, obstack_finish (obstack_ptr));
vcbuild的簡單使用
vcbuild 命令列 更新 2007 年 11 月 vcbuild 工具使用以下命令列語法來生成 visual c 專案和解決方案。複製 vcbuild options project solution config all 標誌 options生成選項。有關更多資訊,請參見 vcbuild 選項...
QList的簡單使用
qlistlist list 1 2 3 4 5 6 7 8 qlist的插入 voidinsert int i,const t value 在qlist其中某個位置插入value,假如沒 宣告i i 預設size 及在最後插入value iteratorinsert iterator before...
QTreeWidget的簡單使用
qtreewidget是一種樹形的部件,它以樹的形式顯示各個項,它的每個項使用qtreewidgetitem來表示。qtreewidgetitem的值的表示都是用qstringlist來表示的。簡單的說明一下 for int i 0 i 3 i for int i 0 i 3 i treewidge...