Czy to możliwe, aby uzyskać pozostałą ilość dostępnej pamięci w systemie (x86, x64, PowerPC/Windows, Linux lub MacOS) w standardowy C++ 11 bez awarii?Uzyskaj pozostałą dostępną pamięć w standardowym C++ 11?
naiwny sposób byłoby spróbować przydzielania bardzo duże tablice zaczynające się od zbyt dużych rozmiarów, złapać wyjątki każdym razem to się nie powiedzie i zmniejszyć rozmiar, dopóki nie jest wyjątek. Ale może jest bardziej efektywna/sprytna metoda ...
EDYCJA 1: W rzeczywistości nie potrzebuję dokładnej ilości pamięci. Chciałbym wiedzieć w przybliżeniu (pasek błędu 100 MB), ile mój kod mógłby użyć, gdy go uruchomię.
EDIT 2: Co sądzisz o tym kodzie? Czy bezpieczne jest uruchamianie go na początku mojego programu lub może to spowodować uszkodzenie pamięci?
#include <iostream>
#include <array>
#include <list>
#include <initializer_list>
#include <stdexcept>
int main(int argc, char* argv[])
{
static const long long int megabyte = 1024*1024;
std::array<char, megabyte> content({{'a'}});
std::list<decltype(content)> list1;
std::list<decltype(content)> list2;
const long long int n1 = list1.max_size();
const long long int n2 = list2.max_size();
long long int i1 = 0;
long long int i2 = 0;
long long int result = 0;
for (i1 = 0; i1 < n1; ++i1) {
try {
list1.push_back(content);
}
catch (const std::exception&) {
break;
}
}
for (i2 = 0; i2 < n2; ++i2) {
try {
list2.push_back(content);
}
catch (const std::exception&) {
break;
}
}
list1.clear();
list2.clear();
result = (i1+i2)*sizeof(content);
std::cout<<"Memory available for program execution = "<<result/megabyte<<" MB"<<std::endl;
return 0;
}
Niestety, tym razem wyszło "nie" z dwóch możliwych wyników "może". –
To zależy od platformy i nie jest obsługiwane w standardzie. –
Nie ma "standardowego" sposobu, aby to zrobić. Nawet opisana metoda może nie zwrócić prawidłowych wyników. Musisz użyć funkcji specyficznej dla platformy. –