[英]GlobalMemoryStatusEx doesn't account for new array
我在具有16 GB RAM的Windows 10上使用c ++ builder 10.2 Tokyo。 如果我跑
uint64_t FreeMBs()
{
MEMORYSTATUSEX status;
status.dwLength = sizeof(status);
GlobalMemoryStatusEx(&status);
return status.ullAvailPhys / (1024 * 1024);
}
Mem0=FreeMBs();
std::vector<int64_t> v;
v.resize(1000000000); // 1 billion
Mem1=FreeMBs();
Mem0-Mem1大約為8 GB。
如果,而不是上述,我跑
Mem0=FreeMBs();
int64_t v=new int64_t[1000000000};
Mem1=FreeMBs();
然后Mem0-Mem1大約為零。 如果我使用malloc為數組保留空間,Mem1仍然或多或少地與Mem0保持不變。 我嘗試設置v [1000000000-1] = 0來查看是否觸發了某些內容但它沒有觸發。
為什么不考慮陣列?
寫入數組,你會看到不同的結果。
操作系統根本不會在需要之前使用物理頁面支持您的分配。 這是一個很好的策略,因為在很多情況下,應用程序會詢問他們從未接觸過的內存。 通過等待直到實際需要(當您寫入頁面時)滿足分配而改為滿足頁面錯誤處理程序中的分配時,整個系統會保存大量內存。
換一種說法; 當您分配內存時,您通常只會獲得一系列虛擬地址,但實際物理內存的映射/分配會在以后發生(如果您從未觸摸它,甚至根本不會發生)。
此外,在某些情況下,如果您從未從您分配的內存中讀取 ,那么編譯器可能會優化所有存儲到該內存,因為您顯然不關心它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.