CVmemstorage函數

OpenCV:CvMemStorage
1、動態內存存儲及操作函數
CvMemStorage
typedef struct CvMemStorage
{
struct CvMemBlock* bottom;/* first allocated block */
struct CvMemBlock* top; /* the current memory block - top of the stack */
struct CvMemStorage* parent; /* borrows new blocks from */
int block_size; /* block size */
int free_space; /* free space in the top block (in bytes) */
} CvMemStorage;
內存存儲器是一個可用來存儲諸如序列,輪廓,圖形,子劃分等動態增長數據結構的底層結構。它是由一系列以同等大小的內存塊構成,呈列表型 ---bottom 域指的是列首,top 域指的是當前指向的塊但未必是列尾.在bottom和top之間所有的塊(包括bottom, 不包括top)被完全佔據了空間;在 top和列尾之間所有的塊(包括塊尾,不包括top)則是空的;而top塊本身則被佔據了部分空間 -- free_space 指的是top塊剩餘的空字節數。新分配的內存緩衝區(或顯示的通過 cvMemStorageAlloc 函數分配,或隱示的通過 cvSeqPush, cvGraphAddEdge等高級函數分配)總是起始於當前塊(即top塊)的剩餘那部分,如果剩餘那部分能滿足要求(夠分配的大小)。分配後,free_space 就減少了新分配的那部分內存大小,外加一些用來保存適當列型的附加大小。當top塊的剩餘空間無法滿足被分配的塊(緩衝區)大小時,top塊的下一個存儲塊被置爲當前塊(新的top塊) -- free_space 被置爲先前分配的整個塊的大小。如果已經不存在空的存儲塊(即:top塊已是列尾),則必須再分配一個新的塊(或從parent那繼承,見 cvCreateChildMemStorage)並將該塊加到列尾上去。於是,存儲器(memory storage)就如同棧(Stack)那樣, bottom指向棧底,(top, free_space)對指向棧頂。棧頂可通過 cvSaveMemStoragePos保存,通過 cvRestoreMemStoragePos 恢復指向, 通過 cvClearStorage 重置。
CvMemBlock
內存存儲塊結構
typedef struct CvMemBlock
{
struct CvMemBlock* prev;
struct CvMemBlock* next;
} CvMemBlock;
CvMemBlock 代表一個單獨的內存存儲塊結構。 內存存儲塊中的實際數據存儲在 header塊 之後(即:存在一個頭指針 head 指向的塊 header ,該塊不存儲數據),於是,內存塊的第 i 個字節可以通過表達式 ((char*)(mem_block_ptr+1))[i] 獲得。然而,通常沒必要直接去獲得存儲結構的域。
CvMemStoragePos
內存存儲塊地址
typedef struct CvMemStoragePos
{
CvMemBlock* top;
int free_space;
} CvMemStoragePos;
該結構(如以下所說)保存棧頂的地址,棧頂可以通過 cvSaveMemStoragePos 保存,也可以通過 cvRestoreMemStoragePos 恢復。
________________________________________
cvCreateMemStorage
創建內存塊
CvMemStorage* cvCreateMemStorage( int block_size=0 );
block_size:存儲塊的大小以字節表示。如果大小是 0 byte, 則將該塊設置成默認值 當前默認大小爲64k.
函數 cvCreateMemStorage 創建一內存塊並返回指向塊首的指針。起初,存儲塊是空的。頭部(即:header)的所有域值都爲 0,除了 block_size 外.

cvReleaseMemStorage
釋放內存塊
void cvReleaseMemStorage( CvMemStorage** storage );
storage: 指向被釋放了的存儲塊的指針
函數 cvReleaseMemStorage 釋放所有的存儲(內存)塊 或者 將它們返回給各自的 parent(如果需要的話)。 接下來再釋放 header塊(即:釋放頭指針 head 指向的塊 = free(head))並清除指向該塊的指針(即:head = NULL)。在釋放作爲 parent 的塊之前,先清除各自的 child 塊。
cvClearMemStorage
清空內存存儲塊
void cvClearMemStorage( CvMemStorage* storage );
storage:存儲存儲塊
函數 cvClearMemStorage 將存儲塊的 top 置到存儲塊的頭部(注:清空存儲塊中的存儲內容)。該函數並不釋放內存(僅清空內存)。假使該內存塊有一個父內存塊(即:存在一內存塊與其有父子關係),則函數就將所有的塊返回給其 parent.
cvMemStorageAlloc
在存儲塊中分配以內存緩衝區
void* cvMemStorageAlloc( CvMemStorage* storage, size_t size );
storage:內存塊.
size:緩衝區的大小.
函數 cvMemStorageAlloc 在存儲塊中分配一內存緩衝區。該緩衝區的大小不能超過內存塊的大小,否則就會導致運行時錯誤。緩衝區的地址被調整爲CV_STRUCT_ALIGN 字節 (當前爲 sizeof(double)).
cvMemStorageAllocString
在存儲塊中分配一文本字符串
typedef struct CvString
{
int len;
char* ptr;
}
CvString;
CvString cvMemStorageAllocString( CvMemStorage* storage, const char* ptr, int len=-1 );
storage:存儲塊
ptr:字符串
len:字符串的長度(不計算'/0')。如果參數爲負數,函數就計算該字符串的長度。
函數 cvMemStorageAlloString 在存儲塊中創建了一字符串的拷貝。它返回一結構,該結構包含字符串的長度(該長度或通過用戶傳遞,或通過計算得到)和指向被拷貝了的字符串的指針。
cvSaveMemStoragePos
保存內存塊的位置(地址)
void cvSaveMemStoragePos( const CvMemStorage* storage, CvMemStoragePos* pos );
storage:內存塊.
pos:內存塊頂部位置。
函數 cvSaveMemStoragePos 將存儲塊的當前位置保存到參數 pos 中。 函數 cvRestoreMemStoragePos 可進一步獲取該位置(地址)。
cvRestoreMemStoragePos
恢復內存存儲塊的位置
void cvRestoreMemStoragePos( CvMemStorage* storage, CvMemStoragePos* pos );
storage:內存塊.
pos:新的存儲塊的位置
函數 cvRestoreMemStoragePos 通過參數 pos 恢復內存塊的位置。該函數和函數 cvClearMemStorage 是釋放被佔用內存塊的唯一方法。注意:沒有什麼方法可去釋放存儲塊中被佔用的部分內存。

發佈了13 篇原創文章 · 獲贊 12 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章