Ответ
Способ зависит от операционной системы. Приведу два наиболее распространённых подхода для 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).
Ответ 18+ 🔞
А, ну это же классика, ёпта! Каждый программист рано или поздно сталкивается с задачей узнать, сколько у него оперативки торчит в материнке. И тут, блядь, начинается цирк с конями, потому что в каждой операционке — свои заморочки. Сейчас разложу по полочкам, чтобы ты не пиздел, а делал.
В Линуксе (через /proc/meminfo)
Тут всё просто, как три копейки. Всё, что тебе нужно, лежит в виртуальном файле /proc/meminfo. Открываешь его и читаешь, как обычный текстовый файл. Вообще, /proc — это такая волшебная папка, где ядро выкладывает всю подноготную о системе. Удивление пиздец, правда?
#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;
}
Плюсы: Проще некуда, и не нужно быть рутом. Просто открыл и прочитал.
Минусы: Привязан к Линуксу и формату этого файла. Если вдруг ядро решит поменять вывод — твой код накроется медным тазом. И парсить строки вручную — это ещё то удовольствие, лучше через std::istringstream.
В Винде (через GlobalMemoryStatusEx)
А вот тут уже начинается ёперный театр. Винда так просто не сдаётся, ей подавай специальный WinAPI вызов. Зато выглядит солидно.
#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;
}
Плюсы: Это официальный, мать его, способ. Работает чётко. Минусы: Ну понятное дело, этот код на Линуксе не скомпилируется. Переносимость — ноль ебать.
Кроссплатформенное решение
А вот если тебе нужно, чтобы работало везде, то тут два пути, чувак. И оба — с подводными камнями.
- Использовать готовую библиотеку. Например, в Qt есть готовая функция
QSysInfo::totalMemory(). Красота, одна строка. Но, блядь, тебе придётся тащить за собой всю эту монструозную библиотеку, даже если кроме памяти тебе от неё ничего не нужно. Это как для того, чтобы вкрутить лампочку, вызывать целую строительную бригаду. - Писать свою абстракцию. Самый честный, но и самый мозгоебский способ. Суть в том, что ты пишешь красивую функцию
get_total_ram(), а внутри неё — куча директив препроцессора (#ifdef _WIN32). В одной ветке — виндовый код, в другой — линуксовый. Выглядит профессионально, но поддерживать эту хитрожопую конструкцию — то ещё удовольствие. Один раз запутаешься в дефайнах, и всё, пиши пропало.
Вывод? Если пишешь под одну конкретную систему — бери способ для неё и не парься. Если нужна кроссплатформенность — готовься к боли, либо ищи библиотеку, которая уже всё за тебя сделала. Волнение ебать, но ничего не поделаешь.