[英]Why the C++ global variable not affect to memory usage of program
在我的程序中,我聲明了一個初始化的全局變量(作為數組)。 但它只影響可執行文件的大小,程序的內存使用量不受影響。
我的程序就是這樣
char arr[1014*1024*100] = {1};
int _tmain(int argc, _TCHAR* argv[])
{
while (true)
{
}
return 0;
}
可執行文件的大小為118MB,但運行程序時的內存使用量僅為0.3MB
有人能為我解釋一下嗎?
大多數操作系統使用按需分頁的虛擬內存。
這意味着當您加載程序時,該程序的可執行文件不允許立即加載到內存中。 而是設置虛擬內存頁面以將文件映射到內存。 何時(以及如果)實際引用地址會導致頁面錯誤,操作系統隨后通過將文件的相應部分讀入物理內存來處理,然后讓指令重新執行。
在您的情況下,您不參考arr
,因此操作系統永遠不會將該數據提取到內存中。
如果您要查看程序使用的虛擬地址空間(而不是您現在正在查看的物理內存),您可能會看到為所有arr
分配的地址空間。 雖然虛擬地址空間通常不是非常有趣或有用,但是大多數告訴您內存使用情況的事情只會告訴您用於存儲實際數據的物理RAM,而不是分配但從未使用過的虛擬地址空間。
即使您確實參考了數據,操作系統也可能相當聰明:根據您引用數據的頻率(以及是否修改數據),在任何給定時間,只有部分數據可能會被加載到RAM中。 如果它被修改,可以將修改后的部分寫入頁面文件,以便在RAM中為更頻繁使用的數據騰出空間。 如果它沒有被修改,它可以被丟棄(因為原始數據可以在需要時從磁盤上的原始文件重新加載)。
在執行可執行文件時使用內存的原因遠遠小於硬盤驅動器(或固態驅動器)上存儲可執行文件所需的空間,因為您沒有將數組本身拉入內存。
在你的程序中,你永遠不會訪問或調用你的數組 - 更不用說同時並入內存了。 因此,與可執行文件的大小(必須存儲大型數組)相比,運行可執行文件所需的內存非常小。
我希望這是有道理的。 兩者之間的區別在於一個正在執行,一個存儲在計算機的內部磁盤上。 只有當它被帶入記憶時才會被執行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.