openCV動態記憶體儲存及操作函數

來源:互聯網
上載者:User
 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 外.
________________________________________
cvCreateChildMemStorage
建立子記憶體塊
CvMemStorage* cvCreateChildMemStorage( CvMemStorage* parent );parent    父記憶體塊
函數 cvCreateChildMemStorage
建立一類似於普通記憶體塊的子記憶體塊,除了記憶體配置/釋放機制不同外。當一個子儲存塊需要一個新的塊加入時,它就試圖從parent
那得到這樣一個塊。如果 parent 中 還未被佔據空間的那些塊中的第一個塊是可獲得的,就擷取第一個塊(依此類推),再將該塊從 parent 
那裡去除。如果不存在這樣的塊,則 parent 要麼分配一個,要麼從它自己 parent (即:parent 的 parent)
那借個過來。換句話說,完全有可能形成一個鏈或更為複雜的結構,其中的記憶體儲存塊互為 child/ parent
關係(父子關係)。當子儲存結構被釋放或清除,它就把所有的塊還給各自的 parent. 在其他方面,子儲存結構同普通儲存結構一樣。
子儲存結
構在下列情況中是非常有用的。想象一下,如果使用者需要處理儲存在某個塊中的動態資料,再將處理的結果存放在該塊中。在使用了最簡單的方法處理後,臨時資料
作為輸入和輸出資料被存放在了同一個儲存塊中,於是該儲存塊看上去就類似下面處理後的樣子: Dynamic data processing
without using child storage.
結果,在儲存塊中,出現了垃圾(臨時資料)。然而,如果在開始處理資料前就先建立一個子儲存塊,將臨時資料寫入子儲存塊中並在最後釋放子儲存塊,那麼最終
在 源/目的儲存塊 (source / destination storage) 中就不會出現垃圾,
於是該儲存塊看上去應該是如下形式:Dynamic data processing using a child storage.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 是釋放被佔用記憶體塊的唯一方法。注意:沒有什麼方法可去釋放儲存塊中被佔用的部分記憶體。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.