如果我們的程式需要動態記憶體的話,則遲早會呼叫win32函式virtualalloc。但是程式也可以不呼叫virtualalloc,而是直接呼叫windows堆函式或者crt堆函式。不過,知道virtualalloc如何工作,可以幫助我們更好地理解這些呼叫函式。
首先,必須知道保留(reserved)記憶體和占用(committed)記憶體的含義。當內存放保留時,一段連續虛擬位址空間被留出。例如,假如我們的程式要使用5 -mb記憶體塊(稱為區域),但並不是要馬上全部使用,則我們可以呼叫virtualalloc函式,使用mem_reserve分配型別引數。windows會以64 kb為邊界計算該區域的起始位址,並防止程序在同乙個範圍內為其他記憶體保留。我們可以指定區域的起始位址,但更常見的是讓windows為區域分配位址。此時除了位址分配外,其他什麼也沒發生。沒有ram被分配,也沒有交換檔案空間被保留出來。
當我們對記憶體的需求更迫切時,我們可以再次呼叫函式virtualalloc來占用被保留的記憶體,呼叫時使用mem_commit分配型別引數。現在,區域的起始和結束位址都被計算到4kb邊界,對應的交換檔案頁和所要求的頁表被留出來。記憶體塊可以被指定為唯讀或者可讀寫。然而,仍然沒有ram被分配;只有當程式訪問這部分記憶體時ram記憶體才會被真正分配。如果在此之前記憶體沒有被保留,那就不會有問題;如果在此之前記憶體被占用了的話,也不會有問題。所以原則是,在使用記憶體之前一定要先占用。
我們可以呼叫virtualfree函式「收回」(decommit)占用的記憶體,使指定的頁回到保留的狀態。virtualfree也能夠釋放保留的記憶體區域,但我們必須指定其基位址,這個基位址是在前面呼叫virtualalloc保留記憶體時獲得的。
什麼時候才要用到virtualalloc
在沒有c執行庫可用的時候,要用virtualalloc來申請記憶體。另外,virtualalloc還可對申請的記憶體有許多的控制。
1、可以保留位址空間但不是及分配記憶體,在需要的時候再分配;
2、可以宣告分配的記憶體不使用分頁;
3、可以指定內存在盡可能高的位址上分配;
4、指定記憶體的讀、寫、執行屬性和記憶體保護;
5、禁止所分配記憶體被快取記憶體。
我的理解是在 malloc,new的內部實際上還是呼叫了virtualalloc,virtualalloc是可以自己控制頁面的保留,提交,釋放的實際的。實際上我們申請的記憶體沒有使用的時候,都是被放在記憶體頁面中,在使用的時候才會被切換到真正的物理儲存器裡。對於c++程式設計師來說 一般情況使用malloc,new就好了,除非一開始就想給自己保留一大片空間。
Sql Server REPLACE函式的使用
replace 用第三個表示式替換第乙個字串表示式中出現的所有第二個給定字串表示式。語法replace string replace1 string replace2 string replace3 引數 string replace1 待搜尋的字串表示式。string replace1 可以是字元...
Sql Server REPLACE函式的使用
replace 更新替換資料庫某個欄位的的部分的值,比如替換資料庫中url欄位的網域名稱,語法 replace cloum string old string old 引數 cloum 待替換欄位的字串表示式。string old 待查詢的字串表示式。string old 替換用的字串表示式。示列 ...
如何使EnableMenuItem函式的呼叫有效
在mfc環境下menu的修改在預設的情況下是通過ccmdui來改變的,呼叫enablemenuitem函式無效 不管是全域性api還是 cmenu類的成員函式 但是只要修改cframewnd類的乙個成員變數m bautomenuenable就可以使呼叫的函式有效.m bautomenuenable在...