OpenCV函數解析 CvMemstorage

1、動態內存存儲及操作函數

CvMemStorage

typedef struct CvMemStorage

{

struct CvMemBlock* bottom;

struct CvMemBlock* top;

struct CvMemStorage* parent;

int block_size;

int free_space;

} 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是釋放被佔用內存塊的唯一方法。注意:沒有什麼方法可去釋放存儲塊中被佔用的部分內存


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章