C++ стек и куча в оперативной памяти

Я запускаю следующий код C++ на Ubuntu с 4 ГБ оперативной памяти

const long long  nSize = 400000000;
double Array1[nSize];
for(int i=0; i<nSize; i++)
    Array1[i]= 2*2; // store on the stack

И это подходит для оперативной памяти (и мой компьютер не жалуется). Смущает... htop говорит, что во время выполнения почти не используется дополнительная оперативная память... Почему?. (Я обычно оставляю его спать на 100 секунд на случай необходимости обновления)

С другой стороны, если я динамически распределяю огромный массив ( как рекомендуют обучающие программы, подобные этой), - htop говорит мне, что он использует большую часть ОЗУ (если не всю, и он вылетает):

double *pnArray2 = new double[nSize];
for(int i=0; i<nSize; i++)
    pnArray2[i] = 2*2; // store on the heap

Так зачем мне использовать кучу для хранения больших структур данных... если (как в этом примере) стек может обрабатывать еще большие массивы?

Я думал, что куча должна была быть больше, чем стек! Пожалуйста, скажи мне, где я так ошибаюсь.

1 ответ

Решение

Вероятно, это просто оптимизатор, выполняющий свою работу (или нет, во втором случае). Вероятно, ему сложнее оптимизировать второе выделение, поскольку теоретически вы можете получить доступ к этой памяти вне области указателя.

Мне удалось воспроизвести это в MSVS 2010, в режиме выпуска и добавить простой

std::cout << Array1[42];

довел использование памяти до того же значения. (предоставлено, я использовал более низкое значение)

Там также нет кода, сгенерированного для первого фрагмента, но есть для второго.

Другие вопросы по тегам