在應用程序中使用虛擬內存(VirtualAlloc VirtualFree)

此虛擬內存非彼虛擬內存,此虛擬內存實際上指的是虛擬地址空間
LPVOID VirtualAlloc{
LPVOID lpAddress, // 要分配的內存區域的地址
DWORD dwSize, // 分配的大小
DWORD flAllocationType, // 分配的類型
DWORD flProtect // 該內存的初始保護屬性
};
1.這個函數可以用來對虛擬地址空間進行分配(保留操作MEM_RESERVE)
2.這個函數可以把已經保留的虛擬地址提交到物理存儲器(MEM_COMMIT)
3.這個函數可以使RAM上的內容無效(MEM_RESET)

這個函數的注意點
1.該函數會將傳入lpAddress圓整爲64KB(分配粒度)的倍數,然後通過返回值傳一個基地址給你,也就是說該函數返回的值要麼爲NULL,要麼爲64KB的倍數
2.如果該函數調用失敗,會直接返回NULL
3.當函數進行保留操作時,不管使用怎樣的保護屬性,都對提交的保護屬性沒影響,但是,若是想讓系統高效運行,最好讓保留操作和提交操作的保護屬性一致
4.保留操作和提交操作可以同時進行,方法是設置flAllocationType=MEM_RESERVE|MEM_COMMIT
5.使用MEM_RESET標誌可使RAM頁面內容無效,防止系統佔用已用內存時,把RAM寫到硬盤的頁文件,因爲這個操作會降低系統的運行效率,但是經過我的測試,這個標誌只在windows2000下有效,在windows xp 或者win7無效(所以這條可以不考慮)

BOOL VirtualFree(
LPVOID lpAddress, // 區域地址
SIZE_T dwSize, // 區域大小,字節
DWORD dwFreeType // 類型);
看名字都看得出來,這個函數時釋放或者解除虛擬地址到物理存儲器的映射
使用這個函數時只能釋放區域的全部內存,但是收回物理存儲器時卻可不受此限制

我們來說說這個函數的應用
假如你有一個表格,爲200行X256列,如果一個單元格的結構大小爲128字節,大概需要6553600個字節的空間,這段內存分頁的話大概也需要1600*4K,也就是需要1600個RAM頁,但是可能我們只有幾個單元格填入內容,可以說,內存的使用率極低
當然也有其他的方法,就是鏈表,用到一個單元格就申請相應的內存,然後連接到鏈表上,但是,這麼做的話,不便於直觀的得到每個單元格的內容,因爲我們必須要遍歷鏈表,現在有了虛擬地址空間,我們就可以嘗試新的方法了
1.先申請保留200*256*128個字節的虛擬地址空間,當然這是一個二維的地址數組,比如p[200][256];
2.然後,假如第100行100列的單元格填入內容,我們就設法找到p[99][99]的虛擬內存地址,然後使用VirtualAlloc把該地址提交到物理存儲器
3.當然就上面的步驟而言還需要做個內存檢查(檢查虛擬地址是否已經提交到物理存儲器)
4.設置新的單元格數據結構的成員

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