2010-11-04 5 views
0

как мы можем очистить стек ...чистый стек в C++

Оператор возврата используется для выхода из функции. Теперь

if (m1.high_[0] < m2.low_[0]) return FALSE;

здесь есть m1 и m2 две точки с высоким [0], низким [0], низким [1] и высоким [1] значением ..

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

ответ

3

Да, всякий раз, когда функция возвращает, выполняя 'return XXXX', стек стека для соответствующей функции удаляется. В этом процессе уничтожаются объекты локального автоматического хранения. Также это может включать в себя манипулирование некоторыми регистром процессора (например, ESP, EBP на Intel) и является специфическим для реализации. Это не имеет значения, если оператор возврата выполняется в состоянии или на значение, которое возвращается

EDIT 2:

В коде ниже, локальный объект «s» (который имеет автоматическую продолжительность хранения) разрушается. Локальный объект «p» и «x» также уничтожаются, но память, на которую указывает «p», которая была newe'd, не удаляется автоматически до тех пор, пока явно не будет удалено (с использованием delete). Все это происходит независимо от того, когда функция «е» возвращается через «возвращает истину» или «вернуться ложным»

struct S{}; 
bool f(int x){ 
    S s; 
    S *p = new S; 
    if(x == 2) return true; 
    else return false; 
} 
+0

ОК, но если я скажу, что (m1.high_ [0] Model

+0

Помните, что любая память, которую вы выделили с помощью 'new', по-прежнему будет рассмотрена, если вы явно не удалите ее перед' return'. –

+1

Нет. False или true не диктует факт, если стек должен быть очищен или нет. возврат из функции включает очистку кадра стека вызываемой функции независимо от значения, возвращаемого функцией. – Chubsdad

4

Вы действительно не «чистый» стек. Все, что происходит, - это указатель стека сбрасывается на верхнюю часть хранилища стека вызывающих программ.

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

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


Для уточнения C C++ программа поддерживает три типа распределения памяти: -

"статический", который effectivly глобальный к блоку компиляции. При запуске основной программы выделяется подходящий кусок хранилища, и каждому «статическому» выделяется адрес в этом куске неподвижности. Используется до завершения основной программы.

«heap» это коллекция областей хранения, управляемых «malloc», с небольшой помощью от базовой операционной системы. Большинство (но не все!) «Новые» объекты так же выделяют память.

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

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

+0

Это правильный ответ, я думаю. – Anthony

+0

@ Джеймс: с вашим утверждением кажется, что в стеке хранятся все глобусы и локальные переменные и все такое. Но очистка памяти происходит фактически в указателе стека .. мы даем указатель, я имею в виду let say int * a = & b, вот его указатель на int, но если я не укажу указатель, то эти переменные не будут удалены. это ? с вашим заявлением i jsut coem, чтобы знать это. Фактически, что такое стек. stack - это местоположение памяти, теперь какой указатель si указывает на местоположение в стеке, поэтому, если я не использую указатель, чем моя переменная не удаляется, так как управление отключается от функции. это? – Model

+0

Это правильно с одной оговоркой ... Он также, похоже, ищет, где хранится возвращаемое значение. На X86-32, по крайней мере, он хранится в EAX, если он подходит (например, указатель, int32, int16, int8 и т. Д.), Но ...Значения с плавающей точкой возвращаются поверх стека с плавающей запятой. В верхней части моей головы я не помню соглашений X86-64, а также соглашений для X86-32, когда что-то слишком велико, чтобы вписаться в EAX. – JimR

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