Я запускаю следующий код 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
Так Зачем я должен использовать кучу для хранения больших структур данных … если (как в этом примере) стек может обрабатывать еще большие массивы?
Я думал, что куча должна была быть больше, чем стек! Пожалуйста, скажи мне, где я так ошибаюсь.
Вероятно, это просто оптимизатор, выполняющий свою работу (или нет, во втором случае). Вероятно, ему сложнее оптимизировать второе выделение, поскольку теоретически вы можете получить доступ к этой памяти вне области указателя.
Мне удалось воспроизвести это в MSVS 2010, в режиме выпуска и добавить простой
std::cout << Array1[42];
довел использование памяти до того же значения. (предоставлено, я использовал более низкое значение)
Также нет кода, сгенерированного для первого фрагмента, но есть для второго.
Других решений пока нет …