1. 程式人生 > >VirtualAlloc函式使用總結

VirtualAlloc函式使用總結

   如果我們的程式需要動態記憶體的話,則遲早會呼叫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就好了,除非一開始就想給自己保留一大片空間。


相關推薦

VirtualAlloc函式使用總結

   如果我們的程式需要動態記憶體的話,則遲早會呼叫Win32函式VirtualAlloc。但是程式也可以不呼叫VirtualAlloc,而是直接呼叫Windows堆函式或者CRT堆函式。不過,知道VirtualAlloc如何工作,可以幫助我們更好地理解這些呼叫函式。   

VirtualAlloc函式用法總結 預訂 調撥

VirtualAlloc函式原型為 LPVOID VirtualAlloc( LPVOID lpAddress, // region to reserve or commit SIZE_T dwSize, // size of region DWORD flAllocati

影象分割的主要函式總結

影象分割可以理解為:提取影象的感興趣區域,可以分為兩部分: 第一步:獲取mask區域:defgenerateMask(img): def generateMask(img): blured_img = getBlurImage(img) #①對影象進行高斯平滑濾波

wordpress各種獲取路徑和URl地址的函式總結

wordpress中的路徑也不是很負責,有人為了讓wordpress執行速度更快,就直接寫了絕對地址,其實這樣是很不好的,有可能別人修改了wordpress程式的地址,那麼這樣你編寫的這個外掛或者是主題就只有你自己用,別人無法使用,這樣做得不償失,為了避免錯誤,瞭解WordPress中與獲取路徑相關的函式很重

numpy函式總結

1.numpy.bincount:bin的數量比x中的最大值大1,每個bin給出了它的索引值在x中出現的次數。 # 我們可以看到x中最大的數為7,因此bin的數量為8,那麼它的索引值為0->7 x = np.array([0, 1, 1, 3, 2, 1, 7]) # 索引0出現了1次,

Pytorch loss function函式總結

注意: 很多的loss 函式都有size_average和reduce倆個布林型別的引數。因為一般損失函式都是直接計算batch的資料,因此返回的loss結果都是維度(batch_size, )的向量。 如果 reduce = False,那麼 size_average 引數失

Windows API一日一練(77)VirtualAlloc函式

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

JavaScript常用函式總結

 最近正在學習js語法,講到函式這一塊內容,感覺有些細節還是挺有用的,所以發文總結一下。      javascript這門語言本身就是一種弱型別語言,它不和像java, c ,c#等等這些語言一樣,在宣告變數和方法的時候不需要對齊進行指定資料型別的修飾,

C# 建構函式總結

建構函式 建構函式分為:例項建構函式,靜態建構函式,私有建構函式。 例項建構函式 1、建構函式的名字與類名相同。 2、使用 new 表示式建立類的物件或者結構(例如int)時,會呼叫其建構函式。並且通常初始化新物件的資料成員。 3、除非類是靜態的,否則會為沒有建構函式的類,

損失函式總結

1. 前言 在機器學習中,不同的問題對應了不同的損失函式,不同的損失函式也直接會影響到收斂的快慢和結果的好壞,下面就從不同的損失函式的角度進行一下梳理。 2. 0-1損失函式 0-1損失是指,預測值和目標值不相等為1,否則為0 3. log對數損失函式 邏輯迴歸的損失函式就是對數損失函式,在邏輯迴歸

MySQL基礎之 統計函式總結

五種統計函式:count()、max()、avg()、min()、max()函式 count()函式 count()函式在進行計算的時候,是分情況進行計算的,主要是一下兩種 1、採用count(*)對錶中的記錄進行統計,不管表字段中包含的是NULL值還是非NULL值,都會參與計算 2、而採用count

【六】 makefile常用函式總結

函式的呼叫語法 函式使用“$”呼叫: $(function arguments) ${function arguments}  例如: $(subst .c, .o, test1.c test2.c) 還是來看一個示例: #$(comma)值是一個逗號

Hive日期函式總結

--1.時間戳函式 --日期轉時間戳:從1970-01-01 00:00:00 UTC到指定時間的秒數 select unix_timestamp(); --獲得當前時區的UNIX時間戳 select unix_timestamp('2017-09-15 14:23:00');  sele

深度學習幾種主流啟用函式總結

啟用函式的定義 加拿大蒙特利爾大學的Bengio教授在 ICML 2016 的文章[1]中給出了啟用函式的定義:啟用函式是對映 h:R→R,且幾乎處處可導。 啟用函式的性質 非線性: 當啟用函式是線性的時候,一個兩層的神經網路就可以逼近基本上所有的函數了。但是,如果啟

工具函式總結

1、日期格式轉換 function zeller(date) { const c = parseInt(date.getFullYear() / 100, 10); let y = parseInt(date.getFullYear() % 100, 10); let m =

C語言檔案操作函式總結——超詳細

版權宣告 本文原創作者:谷哥的小弟 作者部落格地址:http://blog.csdn.net/lfdfhl 檔案與流 在C語言中有三種標準流: stdin(standard input stream)標準輸入流。在大多數環境中為從鍵盤輸入;scanf( )和getchar( )

opencv minAreaRect獲取最小方框函式總結

不得不說,opencv的函式還是很豐富的,最近專案需求發現opencv還有minAreaRect這個函式,這個函式的功能就是: @param points Input vector of 2D points, stored in std::vector\<\> or Mat */ CV_

opencv常用函式總結

最近做影象處理專案,總結一下常用的函式: 1,converto :函式轉為任意想要的格式,以及可以新增歸一化係數,這個係數可能要用到mat的最大值和最小值,下面這個函式可以取出最大最小值 2,cv::minMaxLoc(mat,&minim,&maxim);,取出的最大最小值

自己不熟悉的內建函式總結

all() Return True if bool(x) is True for all values x in the iterable. If the iterable is empty, return True.''''''any() Return True if bool(x) is

VS2017檔案操作之使用fopen函式總結

fopen中mode引數 r, w, a, r+, w+, a+ 具體區別 r : 只能讀, 必須存在, 可在任意位置讀取 w : 只能寫, 可以不存在, 必會擦掉原有內容從頭寫 a : 只能寫, 可以不存在, 必不能修改原有內容, 只能在結尾追加寫, 檔案指標無效 r+ : 可讀可