Большой динамический массив в C ++ - PullRequest
0 голосов
/ 30 октября 2009

Короткая задача:

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

с 2 ГБ ОЗУ (на 32-битной ОС) Я не могу заставить его работать с L_size = 3000, что довольно очевидно, так как для этого потребуется прибл. 2.4 ГБ.

Но когда я запускаю 2 копии вышеуказанной программы, каждая с L_size = 1500, она работает - очень медленно, но в итоге оба возвращают allocated в консоли. Таким образом, вопрос - как это возможно? Это связано с виртуальной памятью?

Можно ли хранить один большой массив в виртуальной памяти при работе с другой - в рамках одной программы?

Thx.

Ответы [ 2 ]

7 голосов
/ 30 октября 2009

Да. Операционная система позволит вам выделить до 2 ГБ ОЗУ на процесс. Когда вы запускаете две копии, он будет расти с использованием виртуальной памяти, которая будет очень, очень медленной (поскольку использует жесткий диск), но все еще функционирует.

1 голос
/ 30 октября 2009

Да, это виртуальная память.С L_size = 1500 вы можете запустить первый экземпляр, и он сможет выделить необходимую память.При запуске второго экземпляра память, выделенная первым экземпляром, выгружается на диск, освобождая место в оперативной памяти для второго экземпляра.

Объем ОЗУ, который вы можете выделить в любой момент и в любом отдельном процессе, зависит не только от объема физической ОЗУ и виртуальной памяти (размер файла подкачки), которые у вас есть, но также и от ширины вашегоадреса памяти.На 64-битной машине вы сможете выделить гораздо больше памяти за один процесс, чем на 32-битной машине.

...