2017-02-24 21 views
2

在我的程序中,我聲明瞭一個初始化的全局變量(作爲一個數組)。 但它隻影響可執行文件的大小,程序的內存使用量不受影響。運行程序時爲什麼C++全局變量不影響程序的內存使用

我的計劃是這樣的

char arr[1014*1024*100] = {1}; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    while (true) 
    { 

    } 
    return 0; 
} 

可執行文件的大小爲118MB,但內存佔用僅爲0.3MB

任何人都可以給我解釋一下嗎?

+1

您是否使用優化進行編譯? –

+0

你用什麼來獲得「內存使用量」? (一般閱讀「C數據部分」將提供一個實際問題的答案,例如請參閱http://stackoverflow.com/questions/2297706/data-section-in-c) –

回答

4

當您的可執行文件正在執行時,您的內存使用的原因遠遠小於硬盤驅動器(或固態驅動器)存儲可執行文件所需的空間,因爲您不是將數組本身拉入內存。

在你的程序中,你永遠不會訪問或調用你的數組,更不用說一次把所有數據同時併入內存中。因此,運行可執行文件所需的內存與可執行文件(必須存儲您的大型陣列)的大小相比非常小。

我希望這是有道理的。兩者之間的區別在於一個正在執行,另一個存儲在計算機的內部磁盤上。有些東西只有在被帶入內存時纔會執行。

+0

我已經嘗試訪問我的數組在主功能,但內存使用情況仍然沒有改變。陣列數據是否存儲在磁盤驅動器中,無需使用程序的生命週期? – tuanpm

+0

@tuanpm這個問題的答案包含在Jerry Coffin的答案下面。按需分頁的虛擬內存是關鍵字。僅僅因爲你聲明瞭一個變量,內存不會立即提交。 –

8

大多數操作系統使用按需分頁的虛擬內存。

這意味着當您加載程序時,該程序的可執行文件不允許立即加載到內存中。相反,虛擬內存頁面設置爲將文件映射到內存。當(和如果)您實際引用地址時,會導致頁面錯誤,然後操作系統通過將文件的相應部分讀入物理內存來處理頁面錯誤,然後讓該指令重新執行。

在你的情況下,你不會參考arr,所以操作系統永遠不會將該數據拉入內存。

如果您要查看程序使用的虛擬地址空間(而不是您現在正在查看的物理內存),則可能會看到分配給所有arr的地址空間。儘管虛擬地址空間通常不是非常有趣或有用,但是大多數告訴你內存使用情況的東西只會告訴你用於存儲實際數據的物理RAM,而不是分配但從未使用的虛擬地址空間。

即使您確實參考了數據,操作系統也可能非常聰明:取決於您參考數據的頻率(以及是否修改它),只有部分數據可能會在任何時候加載到RAM中給定的時間。如果修改了部分,可以將修改後的部分寫入分頁文件,以便在RAM中留出更多空間用於更頻繁使用的數據。如果它沒有被修改,它可以被丟棄(因爲原始數據可以在需要時從磁盤上的原始文件重新加載)。

+0

太糟糕了,這不是最佳答案。 :( –

+0

@VadaPoché:發佈的第一個答案通常會得到一個公平的(不公平的)票數,只要它至少有相當好的表現。這就是SO的生活。 –

+0

@VadaPoché西部最快的槍有優勢,但冒了風險,犯了一個錯誤,早期的高舉者嚇壞了無情的人,也就是說,+10代表升起,只有-1代表一次下跌意味着交易通常對你有利 – user4581301

相關問題