Получить размер оперативной памяти - PullRequest
6 голосов
/ 05 апреля 2011

Я хотел бы знать, как я могу получить размер моей оперативной памяти через C ++ (в Windows 7).

Ответы [ 5 ]

7 голосов
/ 05 апреля 2011

Используйте GetPhysicallyInstalledSystemMemory для получения объема ОЗУ, физически установленного на компьютере *1004*.

(Обратите внимание, что для этого требуется Windows Vista SP1 или более поздняя версия.Эта функция недоступна в более ранних версиях операционной системы Windows.)

Замечания в MSDN говорят:

Функция GetPhysicallyInstalledSystemMemory извлекает количество физическиустановленное ОЗУ из таблиц прошивки компьютера SMBIOS. Это может отличаться от объема, сообщаемого функцией GlobalMemoryStatusEx, которая устанавливает для члена ullTotalPhys структуры MEMORYSTATUSEX объем физической памяти, доступной для операционной системы для использования .Объем памяти, доступный операционной системе, может быть меньше объема памяти, физически установленного на компьютере, поскольку BIOS и некоторые драйверы могут резервировать память в качестве областей ввода / вывода для устройств с отображенной памятью, что делает память недоступной для операционной системы.и приложения.

Объем физической памяти, извлекаемый функцией GetPhysicallyInstalledSystemMemory, должен быть равен или превышать объем, сообщаемый функцией GlobalMemoryStatusEx; если он меньше, данные SMBIOS искажаютсяи функция завершается с ошибкой ERROR_INVALID_DATA.Искаженные данные SMBIOS могут указывать на проблему с компьютером пользователя.

Это означает, что вы также захотите посмотреть GlobalMemoryStatusEx.

5 голосов
/ 05 апреля 2011

Хорошо, ребята! Я нашел решение, сделав так [режим гуру включен]:

#define _WIN32_WINNT  0x0501 // I misunderstand that
#include <windows.h>
#include <iostream>
#include <cstdlib>

using namespace std;

int main()
{
   MEMORYSTATUSEX statex;

   statex.dwLength = sizeof (statex); // I misunderstand that

   GlobalMemoryStatusEx (&statex);
   cout << "Physical RAM => " << (float)statex.ullTotalPhys/(1024*1024*1024)<< endl;

   system("PAUSE");
   return EXIT_SUCCESS;
}

Я должен был определить _WIN32_WINNT 0x0501, но я не знаю, почему [режим гуру выключен].

Если бы кто-нибудь мог объяснить мне, что он делает и почему он не работает без него.

Еще одна вещь, что это такое:

statex.dwLength = sizeof (statex);
5 голосов
/ 05 апреля 2011

В Windows:

typedef BOOL (WINAPI *PGMSE)(LPMEMORYSTATUSEX);
PGMSE pGMSE = (PGMSE) GetProcAddress( GetModuleHandle( TEXT( "kernel32.dll" ) ), TEXT( "GlobalMemoryStatusEx") );
if ( pGMSE != 0 )
{
    MEMORYSTATUSEX mi;
    memset( &mi, 0, sizeof(MEMORYSTATUSEX) );
    mi.dwLength = sizeof(MEMORYSTATUSEX);
    if ( pGMSE( &mi ) == TRUE )
        os << "RAM: " << mi.ullTotalPhys / 1048576 << "MB";
    else
        pGMSE = 0;
}
if ( pGMSE == 0 )
{
    MEMORYSTATUS mi;
    memset( &mi, 0, sizeof(MEMORYSTATUS) );
    mi.dwLength = sizeof(MEMORYSTATUS);
    GlobalMemoryStatus( &mi );
    os << "RAM: " << mi.dwTotalPhys / 1048576 << "MB";
}

В Linux:

Чтение /proc/meminfo.

4 голосов
/ 05 апреля 2011

Вы хотите использовать GlobalMemoryStatusEx , который возвращает MEMORYSTATUSEX .Поле, которое вы хотите, называется ullTotalPhys.

1 голос
/ 18 апреля 2011

0x501 - это версия WindowsXP, т. Е. Структура MEMORYSTATUSEX не поддерживается некоторыми более старыми версиями Windows. Ваш windef.h, вероятно, указывает на более низкий WINVER, чем 0x5XX.

...