E 'possibile ottenere la memoria disponibile rimanente su un sistema (x86, x64, PowerPC/Windows, Linux o MacOS) nello standard C++ 11 senza arrestarsi in modo anomalo?Ottieni la memoria disponibile rimanente in C++ 11 standard?
Un modo semplice sarebbe quello di provare allocare le matrici molto grandi a partire da troppo grandi dimensioni, intercettare le eccezioni ogni volta fallisce e ridurre le dimensioni fino a quando viene lanciata non fa eccezione. Ma forse c'è un metodo più efficiente/intelligente ...
MODIFICA 1: In effetti non ho bisogno della quantità esatta di memoria. Mi piacerebbe sapere approssimativamente (barra di errore di 100 MB) quanto il mio codice potrebbe utilizzare quando lo avvio.
EDIT 2: Cosa ne pensi di questo codice? È sicuro eseguirlo all'inizio del mio programma o potrebbe danneggiare la memoria?
#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;
}
Siamo spiacenti, questa volta il "no" tra i due possibili risultati di "forse" è uscito. –
Questo è altamente dipendente dalla piattaforma e non è trattato nello standard. –
Non esiste un modo "standard" per farlo. Anche il metodo che descrivi potrebbe non restituire risultati validi. È necessario utilizzare funzionalità specifiche della piattaforma. –