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];

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

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

1

Другие решения

Других решений пока нет …