Ответ
Способ зависит от операционной системы. Приведу два наиболее распространённых подхода для Linux и Windows.
В Linux (через /proc/meminfo)
Самый простой и распространённый способ — чтение виртуального файла /proc/meminfo.
#include <fstream>
#include <iostream>
#include <string>
int main() {
std::ifstream meminfo("/proc/meminfo");
std::string line;
while (std::getline(meminfo, line)) {
if (line.find("MemTotal:") == 0) {
// Строка вида "MemTotal: 16294144 kB"
std::cout << "Total RAM: " << line.substr(10) << 'n';
break;
}
}
return 0;
}
Плюсы: Простота, не требует специальных прав.
Минусы: Зависит от наличия и формата /proc. Для парсинга лучше использовать std::istringstream.
В Windows (через GlobalMemoryStatusEx)
Используем WinAPI функцию GlobalMemoryStatusEx.
#include <windows.h>
#include <iostream>
int main() {
MEMORYSTATUSEX memInfo;
memInfo.dwLength = sizeof(MEMORYSTATUSEX);
if (GlobalMemoryStatusEx(&memInfo)) {
// ullTotalPhys содержит общий объём физической памяти в байтах
DWORDLONG totalMB = memInfo.ullTotalPhys / (1024 * 1024);
std::cout << "Total RAM: " << totalMB << " MB" << std::endl;
} else {
std::cerr << "Failed to get memory info. Error: " << GetLastError() << std::endl;
}
return 0;
}
Плюсы: Официальный API Windows. Минусы: Код не переносим на другие ОС.
Кроссплатформенное решение
Для переносимого кода лучше использовать сторонние библиотеки:
- Qt:
QSysInfo::totalMemory()(требует линковки с QtCore). - Boost: Нет прямой функции, но можно использовать
boost::dll::program_location()и системно-зависимый код в отдельных модулях. - Собственная абстракция: Реализовать обёртку, которая в зависимости от платформы вызывает нужный метод (через
#ifdef _WIN32).