0

短问题:

#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;
}

使用 2GB 的 RAM(在 32 位操作系统上)我无法使用它,L_size = 3000这很明显,因为它需要大约。2.4GB。

但是当我启动上述程序的 2 个副本时,每个副本都L_size = 1500可以正常工作 - 真的很慢,但最终都allocated在控制台中返回。所以问题是——这怎么可能?它与虚拟内存有关吗?

可以将一个大数组存储在虚拟内存中,同时在另一个程序上操作 - 在一个程序中?

谢谢。

4

2 回答 2

7

是的。操作系统将允许您为每个进程分配多达 2GB 的 RAM。当您启动两个副本时,它将使用虚拟内存增长,这将非常非常慢(因为它正在使用硬盘驱动器),但仍然可以运行。

于 2009-10-30T16:41:13.147 回答
1

是的,它是虚拟内存。使用 L_size = 1500,您可以启动第一个实例,它将能够分配所需的内存。当您启动第二个实例时,第一个实例分配的内存将被调出到磁盘,从而为第二个实例腾出 RAM 空间。

您可以在任何时间和任何一个进程中分配的 RAM 数量不仅取决于您可用的物理 RAM 和虚拟内存(页面文件大小)的数量,还取决于内存地址的宽度。在 64 位机器上,您将能够在单个进程中分配比 32 位机器上更多的内存。

于 2009-10-30T16:44:50.567 回答