2015-06-15 15 views
1

Я читал, что, когда динамическая память выделяется в куче во время выполнения, статическая память выделяется в стеке во время компиляции, так как компилятор знает, сколько памяти нужно выделить во время компиляции.Память C++, выделенная во время компиляции

Рассмотрим следующий код:

int n; 
cin>>n; 
int a[n]; 

Как компилятор, возможно, знаете, сколько памяти выделить для [] во время компиляции, если его фактический размер считывается только во время бега?

+5

Скорее всего, массивы с переменной длиной расширения являются функциями C99, но не разрешены в C++, см. [Этот предыдущий вопрос] (http://stackoverflow.com/q/19775954/1708801), в котором объясняются как «gcc», так и «clang 'разрешить это, но будет предупреждать с флагом' -pedantic'. –

+3

Стек и куча никоим образом не привязаны к статическому и динамическому распределению соответственно. Абсолютно возможно динамически распределять память в стеке. См. Функцию 'alloca'. –

+0

Это замечательный момент, и его следует упоминать каждый раз, когда обсуждаются динамические и статические распределения. Можно ли также статически ставить на кучу? – Botond

ответ

4

Вы не сможете скомпилировать это предложение по указанной вами причине. Для выполнения компиляции C++ должен иметь фиксированное число. Если вы хотите это сделать, вам нужно использовать динамическое распределение.

+0

Возможно, мне что-то не хватает ... Я скомпилировал его с g ++ 4.8.2, и он работал ... – Botond

+4

GCC имеет расширение переменной длины. Попробуйте выполнить компиляцию с помощью '-pedantic'. – TartanLlama

+0

правый, что дает ошибку. Благодаря! – Botond