Оптимизируют ли компиляторы C стек выполнения в случае последовательных вызовов функций? - PullRequest
0 голосов
/ 12 октября 2018

У меня есть основной вопрос о поведении стека вызовов.Я хотел бы знать, как система управляет памятью стека вызовов, когда функция вызывается в конце другой функции.

Например:

void FunctionOne(void)
{
    [...] // Various code operations
    FunctionTwo();
}


void FunctionTwo(void)
{
    [...] // Various code operation
    FunctionThree();
}


void FunctionThree(void)
{
    [...] // Various code operation
    FunctionFour();
    [...] // Various code operation
}

Имеет ли память стека вызововочищается, когда выполнение переходит от FunctionOne () к FunctionTwo (), потому что после вызова FunctionTwo () нет инструкций?

Сохраняет ли память стека весь уровень выполнения при переходе от FunctionTwo () кFunctionThree ()?

Или, может быть, я с самого начала не прав насчет работы стека вызовов и его назначения?

Спасибо за помощь.

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Должно быть похоже на это фото: стек памяти

0 голосов
/ 12 октября 2018

Действительно, вызовы functionTwo() из functionOne() и functionThree() из functionTwo() могут быть сгенерированы как переходы после некоторых конкретных настроек для учета аргументов и локальных переменных вызывающего абонента (что вы можете )очистка стека ).Это называется Оптимизация хвостового вызова .Они также могут быть сгенерированы inline, код вызываемой функции становится частью вызывающей функции.

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

Стандарт не предъявляет никаких требований относительно этого, компилятор должен генерировать код , так какесли вызовы происходят нормально.

...