2012-05-30 2 views
7

Является ли стек распределенным во время выполнения или время компиляции?
Пример:Является ли память стека выделенной во время выполнения или время компиляции?

void main() 
{ 
    int x; 
    scanf("%d", &x); 
    int arr[x]; 
} 
+0

Какова ваша целевая платформа? – user957902

+2

Существование рекурсии говорит мне, что стек должен быть выделен во время выполнения. – Blastfurnace

+0

@ user957902, Как здесь находится целевая платформа? – Jay

ответ

1

Стек всегда выделяются во время выполнения, вы должны стек для выполнения методы не для компиляции.

On Similar Lines

0

Ofcourse стек выделяется во время выполнения. Вам нужна память стека для выполнения кода.ec

Проверьте это link, где обсуждается макет памяти программы на языке C.

5

Стек выделено во время выполнения; Однако макет каждого кадра стека определяется во время компиляции, за исключением массивов с переменным размером.

+0

В дополнение к макету, это базовый адрес стека, который определяется до запуска программы. Это может быть во время компиляции в некотором встроенном или низкоуровневом приложении или адресе, сгенерированном ОС, при передаче управления на ЭЛТ. – ysap

+0

только для документации, [это] (http://en.wikipedia.org/wiki/Call_stack#The_stack_and_frame_pointers) является ссылкой, которая объясняет термин «фрейм стека» .... –

2

как бы выделить время компиляции? если я скомпилирую код на своей машине, но выполняю его на вашем, как компилятор сможет предварительно распределить память для стека на вашем компьютере?

+1

Я думаю, это зависит от вашего определения " выделить». Конечно, было бы возможно, чтобы программа была жестко запрограммирована на использование определенного региона виртуального адресного пространства, например. –

+0

@OliCharlesworth и как у вас есть компилятор, гарантирующий, что регион действительно поместится в памяти? Я работал над MCU, где память была подсчитана в байтах, и у меня есть множество фигур Gb в машинах на работе. что-то, что поместилось бы на этих машинах, могло бы иметь шанс на упомянутый MCU. –

+1

Нужно ли это обеспечить, чтобы оно поместилось? С распределением времени выполнения он обычно не делает так, чтобы было достаточно памяти, программа просто потрясает, если у нее заканчивается нехватка памяти для стека. ака. stackoverflow. – nos

2

This должен помочь. Хранилище стека выделяется во время выполнения.

Имейте в виду, что он должен быть выделен во время выполнения, поскольку компилятор не знает, сколько раз вызывается функция, или сколько раз выполняется цикл while или что-то еще.

2

Он должен быть выделен во время выполнения. Рассмотрим следующий пример:

void a(void) 
{ 
    int x; 
} 

void b(void) 
{ 
    int y; 
    a(); 
} 

int main(void) 
{ 
    a(); 
    b(); 
} 

адрес стека локального х в() будет отличаться между его двумя вызовами. Как отмечает blinkenlights, компоновка кадра стека каждой функции во многом определяется во время компиляции, но размещение этого фрейма определяется во время выполнения.

+0

+1 - хорошая визуализация –

1

В дополнение ко всем остальным ответам (которые правильны в общем случае), теоретически возможно распределять стек во время компиляции (в зависимости от вашего определения «allocate»).

В частности, если ваша программа не имеет указателей на функцию или рекурсии, то можно использовать статический анализ, чтобы определить максимальный размер стека. Действительно, некоторые встроенные компиляторы делают именно это.

+0

+1 Это именно то, что происходит во встроенных системах –

0

Проверить эту большую статью

http://duartes.org/gustavo/blog/post/anatomy-of-a-program-in-memory

Это отличный подправить, который объясняет о памяти программы. Вы также можете проверить другие статьи того же автора относительно поведения памяти в системе s, которая даст вам большое представление о фактической работе в памяти.

, если вы хотите знать все о памяти попробуйте прочитать эту статью Ульриха Draper http://www.akkadia.org/drepper/cpumemory.pdf

надеюсь, что это помогает!