← Назад к вопросам

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

1.2 Junior🔥 74 комментариев
#Linux и операционные системы

Комментарии (4)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Определение объёма оперативной памяти в системе

В C/C++ можно получить информацию об объёме памяти несколькими способами, в зависимости от платформы.

Linux: /proc/meminfo

#include <fstream>
#include <string>
#include <sstream>

long long get_total_memory_linux() {
    std::ifstream meminfo("/proc/meminfo");
    std::string line;
    
    while (std::getline(meminfo, line)) {
        if (line.find("MemTotal:") == 0) {
            std::istringstream iss(line);
            std::string label;
            long long memory_kb;
            iss >> label >> memory_kb;
            return memory_kb * 1024;  // Преобразуем KB в байты
        }
    }
    return -1;
}

long long get_free_memory_linux() {
    std::ifstream meminfo("/proc/meminfo");
    std::string line;
    
    while (std::getline(meminfo, line)) {
        if (line.find("MemAvailable:") == 0) {
            std::istringstream iss(line);
            std::string label;
            long long memory_kb;
            iss >> label >> memory_kb;
            return memory_kb * 1024;
        }
    }
    return -1;
}

Cross-platform: sysconf() и sysinfo()

#include <unistd.h>
#include <sys/sysinfo.h>

// POSIX способ (Linux, macOS, Unix)
long long get_total_memory_posix() {
    long pages = sysconf(_SC_PHYS_PAGES);
    long page_size = sysconf(_SC_PAGE_SIZE);
    return pages * page_size;
}

long long get_available_memory_posix() {
    long available = sysconf(_SC_AVPHYS_PAGES);
    long page_size = sysconf(_SC_PAGE_SIZE);
    return available * page_size;
}

// Linux способ через sysinfo
long long get_total_memory_sysinfo() {
    struct sysinfo info;
    if (sysinfo(&info) == 0) {
        return (long long)info.totalram * info.mem_unit;
    }
    return -1;
}

long long get_free_memory_sysinfo() {
    struct sysinfo info;
    if (sysinfo(&info) == 0) {
        return (long long)info.freeram * info.mem_unit;
    }
    return -1;
}

Windows: GlobalMemoryStatusEx

#ifdef _WIN32
#include <windows.h>

long long get_total_memory_windows() {
    MEMORYSTATUSEX statex;
    statex.dwLength = sizeof(statex);
    
    if (GlobalMemoryStatusEx(&statex)) {
        return statex.ullTotalPhys;
    }
    return -1;
}

long long get_available_memory_windows() {
    MEMORYSTATUSEX statex;
    statex.dwLength = sizeof(statex);
    
    if (GlobalMemoryStatusEx(&statex)) {
        return statex.ullAvailPhys;
    }
    return -1;
}

double get_memory_usage_percent_windows() {
    MEMORYSTATUSEX statex;
    statex.dwLength = sizeof(statex);
    
    if (GlobalMemoryStatusEx(&statex)) {
        return statex.dwMemoryLoad;  // Процент использования (0-100)
    }
    return -1;
}
#endif

macOS: sysctl

#ifdef __APPLE__
#include <sys/sysctl.h>
#include <mach/mach.h>

long long get_total_memory_macos() {
    int mib[2] = {CTL_HW, HW_MEMSIZE};
    long long size;
    size_t len = sizeof(size);
    
    if (sysctl(mib, 2, &size, &len, nullptr, 0) == 0) {
        return size;
    }
    return -1;
}

long long get_free_memory_macos() {
    vm_statistics64_data_t stats;
    mach_msg_type_number_t count = HOST_VM_INFO64_COUNT;
    
    if (host_statistics64(mach_host_self(), HOST_VM_INFO64, 
                         (host_info64_t)&stats, &count) == KERN_SUCCESS) {
        return stats.free_count * PAGE_SIZE;
    }
    return -1;
}
#endif

Кроссплатформенное решение (C++17)

#include <iostream>
#include <iomanip>

class MemoryInfo {
public:
    static long long get_total_memory() {
#ifdef _WIN32
        return get_total_memory_windows();
#elif __APPLE__
        return get_total_memory_macos();
#else
        return get_total_memory_posix();
#endif
    }
    
    static long long get_available_memory() {
#ifdef _WIN32
        return get_available_memory_windows();
#elif __APPLE__
        return get_free_memory_macos();
#else
        return get_available_memory_posix();
#endif
    }
    
    static double get_memory_usage_percent() {
        long long total = get_total_memory();
        long long available = get_available_memory();
        return ((double)(total - available) / total) * 100.0;
    }
};

int main() {
    long long total = MemoryInfo::get_total_memory();
    long long available = MemoryInfo::get_available_memory();
    double usage_percent = MemoryInfo::get_memory_usage_percent();
    
    std::cout << "Total RAM: " << (total / 1024 / 1024 / 1024) << " GB" << std::endl;
    std::cout << "Available: " << (available / 1024 / 1024 / 1024) << " GB" << std::endl;
    std::cout << "Usage: " << std::fixed << std::setprecision(2) 
              << usage_percent << "%" << std::endl;
}

Проверка памяти процесса

#include <fstream>

long long get_process_memory_usage() {
    std::ifstream status("/proc/self/status");
    std::string line;
    
    while (std::getline(status, line)) {
        if (line.find("VmRSS:") == 0) {
            std::istringstream iss(line);
            std::string label;
            long long memory_kb;
            iss >> label >> memory_kb;
            return memory_kb * 1024;
        }
    }
    return -1;
}

// Linux способ через /proc/self/stat
unsigned long get_process_resident_memory() {
    std::ifstream stat("/proc/self/stat");
    unsigned long rss = 0;
    
    for (int i = 0; i < 23; ++i) {
        stat >> rss;
    }
    
    return rss * 4096;  // sysconf(_SC_PAGE_SIZE)
}

Практический пример с обработкой ошибок

#include <iostream>
#include <string>

void print_memory_info() {
    long long total = MemoryInfo::get_total_memory();
    long long available = MemoryInfo::get_available_memory();
    
    if (total == -1 || available == -1) {
        std::cerr << "Error: Unable to get memory information" << std::endl;
        return;
    }
    
    long long used = total - available;
    double percent = (double)used / total * 100.0;
    
    std::cout << "System Memory Status:" << std::endl;
    std::cout << "  Total: " << (total / 1024 / 1024) << " MB" << std::endl;
    std::cout << "  Used: " << (used / 1024 / 1024) << " MB" << std::endl;
    std::cout << "  Available: " << (available / 1024 / 1024) << " MB" << std::endl;
    std::cout << "  Usage: " << std::fixed << std::setprecision(1) 
              << percent << "%" << std::endl;
}

Вывод: Способ получения информации о памяти зависит от платформы, поэтому рекомендуется использовать кроссплатформенное решение с условной компиляцией или готовые библиотеки вроде Boost.System.

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