Как узнать, сколько оперативной памяти в системе, из кода на C++?

«Как узнать, сколько оперативной памяти в системе, из кода на C++?» — вопрос из категории Linux и ОС, который задают на 25% собеседований C/C++ Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Способ зависит от операционной системы. Приведу два наиболее распространённых подхода для 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).