(一)動態的記憶體結構 CvMemBlock

2021-05-24 23:01:51 字數 2260 閱讀 8129

記憶體儲存塊

typedef struct cvmemblock

struct cvmemblock*  prev;

struct cvmemblock*  next;

cvmemblock;

解釋:cvmemblock 代表乙個單獨的記憶體儲存塊結構。 記憶體儲存塊中的實際資料儲存在 header塊 之後(即:存在乙個頭指標 head 指向的塊 header ,該塊不儲存資料),於是,記憶體塊的第 i 個位元組可以通過表示式 ((char*)(mem_block_ptr+1))[i] 獲得。然而,通常沒必要直接去獲得儲存結構的域。

則乙個記憶體塊結構為  cvmemblock block;

指標prev

指標next

實際的資料

實際資料

。。。

。。。

。。。

。。。

其中記憶體塊的記憶體分配與下乙個結構有關

動態記憶體儲存器

typedef struct cvmemstorage

int signature;

cvmemblock* bottom;           /* first allocated block.                   */

cvmemblock* top;              /* current memory block - top of the stack. */

struct  cvmemstorage* parent; /* we get new blocks from parent as needed. */

int block_size;               /* block size.                              */

int free_space;               /* remaining free space in current block.   */

其中block_size定義了每個cvmemblock的大小,上圖為4*8*3=96

其實就是乙個堆疊

棧的單元為乙個cvmemblock塊,其大小已定為block_size

bottom為棧底,top為棧頂,top部分被資料佔據

top指標。。

。。。。。。。。。。

。。。。。。。。。。

。。。。。。。。。。

。。。。。。。。。。

。。。。。。。。。。

。。。。。。。。。。

bottom指標。。。。

以上就可以是個cvmemstorage,但是每層之間不是依靠物理位置聯絡,是用雙向指標聯絡在一起,這保證了動態性質。

從儲存器中分配記憶體的函式為

cvmemstoragealloc

其分配原理為,如果分配大小小於top塊的free_space則直接分配,減小free_space就行了。如果不夠分配,則重新找到一塊新的儲存塊。

有以前申請的後繼儲存塊,就把top指標後移。

其次,有父儲存器的話,向父儲存器要。肯定給,因為遞迴呼叫,父儲存器按照這3條規則找到新的儲存塊

最後沒轍了,就自己申請一塊新的儲存塊。

釋放記憶體塊函式為

cvreleasememstorage

演算法之一動態規劃

問題描述 給定n種物品和一揹包。物品i的重量是wi,其價值為vi,揹包的容量為c。問應如何選擇裝入揹包的物品,使得裝入揹包中物品的總價值最大?對於一種物品,要麼裝入揹包,要麼不裝。所以對於一種物品的裝入狀態可以取0和1.我們設物品i的裝入狀態為xi,xi 0,1 此問題稱為0 11揹包問題。資料 物...

跳躍遊戲一(動態規劃)

給定乙個非負整數陣列,假定你的初始位置為陣列第乙個下標。陣列中的每個元素代表你在那個位置能夠跳躍的最大長度。請確認你是否能夠跳躍到陣列的最後乙個下標。例如 a 2,3,1,1,4 a 2,3 1,1 4 能夠跳躍到最後乙個下標,輸出true a 3,2,1,0,4 a 3,2 1,0 4 不能跳躍到...

面試準備(一) 動態規劃

動態規劃的思路說起來很簡單,但是新遇到乙個題目往往就會卡殼,甚至出現解不出來的情況。因此學習的過程中,有必要對面試準備中涉及到的動態規劃題目記錄,這裡只談思路,不涉及具體實現。通過分析不僅可以總結思路,更重要的是能從這些問題中找出動態規劃題目求解的共性,希望徹底搞定動態規劃!動態規劃常用來解決優化問...