2016-08-16 27 views
0

下考慮下面的代碼片斷:無法測量造成的std ::矢量<> ::保留存儲器分配視窗

void OutputMemoryStatus() 
    { 
    PROCESS_MEMORY_COUNTERS pmc; 
    GetProcessMemoryInfo(::GetCurrentProcess(), &pmc, sizeof(pmc)); 
    std::cout << pmc.WorkingSetSize/(1024.0 * 1024.0) << std::endl; 
    } 

int main() 
    { 
    std::vector<int> vec; 
    OutputMemoryStatus(); 
    vec.reserve(100'000'000); 
    OutputMemoryStatus(); 
    std::cout << vec.capacity() << std::endl; 
    for (int i = 0; i < 1'000'000; ++i) 
    vec.push_back(i); 
    OutputMemoryStatus(); 
    } 

的輸出是下面的:

Memory used: 3.11328 
Memory used: 3.20703 
Capacity: 100000000 
Memory used: 7.03516 

所以似乎儘管保留了400 MB的內存,這是通過調用capacity()來確認的,但Windows並不認爲這個內存是分配的,但是當我們實際上用1'000'000的值填充向量時,該內存(4MB)被視爲已分配。

如何解釋?

我正在使用Visual Studio 2015,Release配置,x86平臺。

UPDATE

現在,編譯器不知道使用的內存的實際數量,但如果我輸入大小= 1'000'000,其結果是,因爲它以前一樣。

int size; 
    std::cin >> size; 
    std::vector<int> vec; 
    OutputMemoryStatus(); 
    vec.reserve(100'000'000); 
    OutputMemoryStatus(); 
    std::cout << "Capacity: " << vec.capacity() << std::endl; 
    for (int i = 0; i < size; ++i) 
    vec.push_back(i); 
    OutputMemoryStatus(); 
+0

@KerrekSB是不是'OutputMemoryStatus();'做了什麼?他們在for循環之後調用它。 – NathanOliver

+0

@KerrekSB用另一個電話更新了問題。 – undermind

+0

@undermind:謝謝 - 現在這是一個真正的問題:-) –

回答

2

的工作集,實際上是在物理內存在任何特定時間的記憶,和改變的內存頁&廉頗老分頁。內存,尤其是大型分配,可以在被分頁時開始。使用它們會將它們分頁,但可能會在此過程中將其他頁面分頁。

PageFileSize可能是更好地衡量提交給進程的內存量。

此外,不確定Windows是否這樣做,但過度使用內存是一件事情,並可能導致操作系統殺死您的程序或其他人認爲適合,如果它發生在機器上的所有進程需要太多記憶在同一時間。

相關問題