簡體   English   中英

GlobalMemoryStatusEx不考慮新數組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM