2015-12-06 2 views
-2

Активационные записи создаются в стеке. Они создаются и уничтожаются во время выполнения программы - это область стека, меняющая свой размер во время прогона программы.Как определить объем памяти в области стека только во время компиляции?

Несмотря на то, что память в области стека создается во время выполнения - объем памяти (размер записи активации) определяется во время компиляции.

Я не понимаю эту концепцию, что когда память в области стека создается во время выполнения, то как размер записи активации определяется во время компиляции?

+0

Количество стека обычно фиксируется для данной операционной системы/операционной среды. Если вы переполнили стек с записями, ваша программа выйдет из строя. – user3159253

+1

Каждый раз, когда вызывается функция, для этого требуется некоторое пространство стека, поэтому выделяется пространство - запись активации. Во время компиляции известно, насколько велика запись активации для данной процедуры (более или менее, массивы переменной длины усложняют вещи), но неизвестно, сколько места потребуется в общей сложности, потому что последовательность вызовов функций isn ' t известно - особенно с рекурсией и т. п. –

+0

Размер определяется локальными переменными, которые функция должна использовать одновременно. Это количество может быть определено при компиляции функции. Единственное, что является динамическим, - это * где * разместить это хранилище. –

ответ

1

Когда ОС запускает процесс, он выделяет фиксированное количество пространства для этого процесса t как стек. Память не создается или не разрушается при запуске или завершении функций. Он заимствован из верхней части того, что не используется в стеке.

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

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

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

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

+0

Этот ответ может относиться к некоторым ОС, но не ко всем. Предложите перечислить ОС, о которых вы пишете. – chux

+1

Это общая схема использования стека фреймов вызовов. Предполагалось уточнить, что, по моему мнению, путает плакат, который, я думаю, связан с функциями, вызывающими функции. Он не был предназначен как окончательное описание использования стека в какой-либо конкретной ОС. Это действительно смутило бы ОП и устранило бы проблему. Если вы чувствуете необходимость вникать в такие подробности, вы можете полностью отвечать самому себе. – StephenG

+0

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

Смежные вопросы