Obstacks的簡單使用

2021-07-10 04:57:28 字數 2996 閱讀 7209

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...