GlobalMemoryStatusEx не учитывает новый массив - PullRequest
0 голосов
/ 27 мая 2018

Я использую C ++ Builder 10.2 Tokyo на Windows 10 с 16 ГБ ОЗУ.Если я запускаю

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 ГБ.

Если вместо вышеупомянутого я запускаю

Mem0=FreeMBs();
int64_t v=new int64_t[1000000000};
Mem1=FreeMBs();

, то Mem0-Mem1 составляет околонуль.Если я использую malloc, чтобы зарезервировать пространство для массива, Mem1 по-прежнему более или менее не отличается от Mem0.Я попытался установить v [1000000000-1] = 0, чтобы посмотреть, вызвало ли это что-то, но это не так.

Почему массив не учитывает?

1 Ответ

0 голосов
/ 27 мая 2018

Запишите в массив, и вы увидите разные результаты.

ОС просто не поддерживает выделение физических страниц до того, как это потребуется.Это хорошая стратегия, поскольку во многих случаях приложения запрашивают память, которую они никогда не трогают.Ожидая удовлетворения выделения до тех пор, пока фактически не потребуется (когда вы пишете на страницу) и вместо этого удовлетворите выделение в обработчике ошибок страницы, система в целом экономит много памяти.

Другими словами;Когда вы выделяете память, вы обычно просто получаете диапазон виртуальных адресов, но сопоставление / выделение реальной физической памяти происходит позже (или даже вовсе не происходит, если вы никогда не касаетесь ее).

Кроме того, в некоторых случаях, если вы никогда не читаете из выделенной памяти, тогда компилятор может оптимизировать все хранилища для этой памяти, поскольку вам, очевидно, это безразлично.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...