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