Вот как функции работают внутри…

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

Итак, прежде чем узнать, что происходит, мы должны знать о :

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

Он работает по принципу LIFO (first-in-last-out), т.е. то, что входит первым, выходит последним.

b. Кадр стека : Это буферная память, которая является элементом стека программы и содержит данные вызываемой функции, т.е. адрес возврата, входной параметр, локальные переменные, сохранение регистров.

c. Указатель стека: Это указатель, который указывает на кадр стека в стеке программы, т.е. на последнюю вызванную функцию.

Эти три элемента можно представить в виде :

Теперь перейдем к самой интересной части:

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

main_function() {

    func1();
}

func1() {

    func2();
}

func2() {

    // does some operation and returns
       back the results to func1()
}

Вход в полноэкранный режим Выход из полноэкранного режима

Как мы знаем, функция main_function всегда выполняется первой в программе, и, согласно приведенному выше псевдокоду (см. рис. a), она вызвала функцию func1(), и при ее вызове был сгенерирован ее стековый фрейм со всеми данными и вставлен в стек программы с указателем стека, указывающим на него, так как этот фрейм был вставлен недавно. Когда func1() начала выполняться, (см. рис. b) она вызвала func2() и аналогично ее стековый фрейм также был помещен в стек и указатель указывает на него. Когда func2() завершает свое выполнение, ее стековый кадр, состоящий из всех ее данных, выталкивается (удаляется) из стека (см. рис. c), а указатель стека начинает указывать на func1(), которая является функцией, вызвавшей func2(), и ее стековый кадр также находится наверху. И когда выполнение каждой функции закончится, их фреймы будут выгружены, а стек опустеет.

Надеюсь, вы поняли….

Спасибо за прочтение❤️

Оцените статью
devanswers.ru
Добавить комментарий