Является ли стек распределенным во время выполнения или время компиляции?
Пример:Является ли память стека выделенной во время выполнения или время компиляции?
void main()
{
int x;
scanf("%d", &x);
int arr[x];
}
Является ли стек распределенным во время выполнения или время компиляции?
Пример:Является ли память стека выделенной во время выполнения или время компиляции?
void main()
{
int x;
scanf("%d", &x);
int arr[x];
}
Стек всегда выделяются во время выполнения, вы должны стек для выполнения методы не для компиляции.
Ofcourse стек выделяется во время выполнения. Вам нужна память стека для выполнения кода.ec
Проверьте это link, где обсуждается макет памяти программы на языке C.
Стек выделено во время выполнения; Однако макет каждого кадра стека определяется во время компиляции, за исключением массивов с переменным размером.
В дополнение к макету, это базовый адрес стека, который определяется до запуска программы. Это может быть во время компиляции в некотором встроенном или низкоуровневом приложении или адресе, сгенерированном ОС, при передаче управления на ЭЛТ. – ysap
только для документации, [это] (http://en.wikipedia.org/wiki/Call_stack#The_stack_and_frame_pointers) является ссылкой, которая объясняет термин «фрейм стека» .... –
как бы выделить время компиляции? если я скомпилирую код на своей машине, но выполняю его на вашем, как компилятор сможет предварительно распределить память для стека на вашем компьютере?
Я думаю, это зависит от вашего определения " выделить». Конечно, было бы возможно, чтобы программа была жестко запрограммирована на использование определенного региона виртуального адресного пространства, например. –
@OliCharlesworth и как у вас есть компилятор, гарантирующий, что регион действительно поместится в памяти? Я работал над MCU, где память была подсчитана в байтах, и у меня есть множество фигур Gb в машинах на работе. что-то, что поместилось бы на этих машинах, могло бы иметь шанс на упомянутый MCU. –
Нужно ли это обеспечить, чтобы оно поместилось? С распределением времени выполнения он обычно не делает так, чтобы было достаточно памяти, программа просто потрясает, если у нее заканчивается нехватка памяти для стека. ака. stackoverflow. – nos
This должен помочь. Хранилище стека выделяется во время выполнения.
Имейте в виду, что он должен быть выделен во время выполнения, поскольку компилятор не знает, сколько раз вызывается функция, или сколько раз выполняется цикл while или что-то еще.
Он должен быть выделен во время выполнения. Рассмотрим следующий пример:
void a(void)
{
int x;
}
void b(void)
{
int y;
a();
}
int main(void)
{
a();
b();
}
адрес стека локального х в() будет отличаться между его двумя вызовами. Как отмечает blinkenlights, компоновка кадра стека каждой функции во многом определяется во время компиляции, но размещение этого фрейма определяется во время выполнения.
+1 - хорошая визуализация –
В дополнение ко всем остальным ответам (которые правильны в общем случае), теоретически возможно распределять стек во время компиляции (в зависимости от вашего определения «allocate»).
В частности, если ваша программа не имеет указателей на функцию или рекурсии, то можно использовать статический анализ, чтобы определить максимальный размер стека. Действительно, некоторые встроенные компиляторы делают именно это.
+1 Это именно то, что происходит во встроенных системах –
Проверить эту большую статью
http://duartes.org/gustavo/blog/post/anatomy-of-a-program-in-memory
Это отличный подправить, который объясняет о памяти программы. Вы также можете проверить другие статьи того же автора относительно поведения памяти в системе s, которая даст вам большое представление о фактической работе в памяти.
, если вы хотите знать все о памяти попробуйте прочитать эту статью Ульриха Draper http://www.akkadia.org/drepper/cpumemory.pdf
надеюсь, что это помогает!
Какова ваша целевая платформа? – user957902
Существование рекурсии говорит мне, что стек должен быть выделен во время выполнения. – Blastfurnace
@ user957902, Как здесь находится целевая платформа? – Jay