Grande array dinamico in c ++
Domanda
Problema breve:
#include <iostream>
using namespace std;
int main()
{
double **T;
long int L_size;
long int R_size = 100000;
long int i,j;
cout << "enter L_size:";
cin >> L_size;
cin.clear();
cin.ignore(100,'\n');
cout << L_size*R_size << endl;
cout << sizeof(double)*L_size*R_size << endl;
T = new double *[L_size];
for (i=0;i<L_size;i++)
{
T[i] = new double[R_size];
}
cout << "press enter to fill array" << endl;
getchar();
for (i=0;i<L_size;i++)
{
for (j=0;j<R_size;j++)
{
T[i][j] = 10.0;
}
}
cout << "allocated" << endl;
for (i=0;i<L_size;i++)
{
delete[] T[i];
}
delete [] T;
cout << "press enter to close" << endl;
getchar();
return 0;
}
con 2 GB di RAM (su sistemi operativi a 32 bit) Non riesco a farlo funzionare con L_size = 3000
che è abbastanza ovvio poiché avrebbe bisogno di ca. 2.4GB.
Ma quando avvio 2 copie del programma precedente ognuna con L_size = 1500
funziona - molto lentamente ma alla fine entrambi restituiscono allocato
nella console.
Quindi la domanda è: come è possibile? È legato alla memoria virtuale?
È possibile avere un array di grandi dimensioni memorizzato nella memoria virtuale mentre si opera su un altro - all'interno di un programma?
Thx.
Soluzione
Sì. Il sistema operativo ti consentirà di allocare fino a 2 GB di RAM per processo. Quando avvii due copie, questo crescerà usando la memoria virtuale, che sarà molto, molto lenta (dal momento che sta usando il disco rigido), ma funzionerà comunque.
Altri suggerimenti
Sì, è memoria virtuale. Con L_size = 1500, è possibile avviare la prima istanza e sarà in grado di allocare la memoria richiesta. Quando si avvia la seconda istanza, la memoria allocata dalla prima istanza viene trasferita su disco, creando spazio nella RAM per la seconda istanza.
La quantità di RAM che è possibile allocare in qualsiasi momento e in ogni processo dipende non solo dalla quantità di RAM fisica e memoria virtuale (dimensioni del file di paging) disponibili, ma anche dalla larghezza degli indirizzi di memoria. Su una macchina a 64 bit, sarai in grado di allocare molta più memoria in un singolo processo rispetto a una macchina a 32 bit.