質問
短い問題:
#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;
}
RAMが2GBの場合(32ビットOSの場合) L_size = 3000
で動作させることはできません。 2.4GB。
しかし、上記のプログラムの2つのコピーをそれぞれ L_size = 1500
で起動すると、動作しますが、最終的には両方ともコンソールで allocated
を返します。
だから問題は-それはどのように可能ですか?仮想メモリに関連していますか?
1つの大きな配列を仮想メモリに格納し、別のプログラムで操作することは可能ですか?
Thx。
解決
はい。オペレーティングシステムでは、プロセスごとに最大2GBのRAMを割り当てることができます。 2つのコピーを開始すると、仮想メモリを使用してこれを成長させることができます。これは非常に遅くなります(ハードドライブを使用するため)が、引き続き機能します。
他のヒント
はい、仮想メモリです。 L_size = 1500では、最初のインスタンスを開始でき、必要なメモリを割り当てることができます。 2番目のインスタンスを起動すると、最初のインスタンスによって割り当てられたメモリがディスクにページアウトされ、2番目のインスタンス用にRAMに空きができます。
一度に割り当て可能なRAMの量は、使用可能な物理RAMと仮想メモリ(ページファイルサイズ)の量だけでなく、メモリアドレスの幅にも依存します。 64ビットマシンでは、1つのプロセスで32ビットマシンよりもはるかに多くのメモリを割り当てることができます。
所属していません StackOverflow