GlobalMemoryStatusEx () (Win32) - PullRequest
       3

GlobalMemoryStatusEx () (Win32)

2 голосов
/ 23 июля 2011

Описание для GlobalMemoryStatusEx () в MSDN гласит:

Информация, возвращаемая функцией GlobalMemoryStatusEx, является изменчивой.Нет гарантии, что два последовательных вызова этой функции вернут одну и ту же информацию.

Одна часть информации, возвращаемая этой функцией, - «Общая физическая память в байтах».(Это отличается от количества свободной физической памяти, для этого есть еще один элемент структуры MEMORYSTATUSEX.)

Как можно изменять общую физическую память при каждом запуске программы?Я вывел значения в текстовый файл и получил следующие результаты:

55872198592
55837267904
8589934605
55835301824
55848146880
55849064384
55849129920
55836743616
8589934605
8589934605
8589934605
8589934605
55835105216

У меня 4 ГБ системной оперативной памяти.Нужно ли вызывать другую функцию API, если я нахожусь на 64-битной ОС?

Вот код:

#include <Windows.h>
#include <string>
#include <sstream>
#include "Game.h"
#include <fstream>

void Game::CheckMemory(DWORDLONG& a)
{
MEMORYSTATUSEX status;
GlobalMemoryStatusEx(&status);

a = status.ullTotalPhys;

std::stringstream ss;

ss << "Total Physical Memory: " << status.ullTotalPhys << "bytes." << std::endl;

MessageBoxA(NULL, ss.str().c_str(), "Mem Summary", 0);
}

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                PSTR szCmdLine, int iCmdShow)
{
DWORDLONG a;
Game g;
g.CheckMemory(a);

std::fstream fs("test.txt", std::fstream::in | std::fstream::out | std::fstream::app);

fs << a << std::endl;

fs.close();

return 0;
}

Ответы [ 3 ]

10 голосов
/ 23 июля 2011

Вы должны инициализировать dwLength член MEMORYSTATUSEX перед вызовом функции.

MEMORYSTATUSEX status;
status.dwLength = sizeof(status);
GlobalMemoryStatusEx(&status);

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

0 голосов
/ 05 марта 2014

как указано в справке msdn: Вы можете использовать функцию GlobalMemoryStatusEx, чтобы определить, сколько памяти может выделять ваше приложение, не оказывая серьезного влияния на другие приложения.

Информация, возвращаемая функцией GlobalMemoryStatusEx, является изменчивой. Нет гарантии, что два последовательных вызова этой функции вернут одну и ту же информацию.

Член ullAvailPhys структуры MEMORYSTATUSEX в lpBuffer включает память для всех узлов NUMA.

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

0 голосов
/ 23 июля 2011

Вы уверены, что выводите правильное поле? Первое число, которое вы указали, составляет около 55 ГБ, что не имеет большого смысла, если у вас есть только 4 ГБ ОЗУ.

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