Здравствуйте, Эйнсток Файр, Вы писали:
ЭФ>До выполнения точки Т1 мы должны выделить
ЭФ>А+Б+В+Г+Д(количество вызовов других функций)*размер указателя на блок для функции
ЭФ>единиц памяти.
ЭФ>Там же мы должны создать сразу блоки под каждую из других функций.
Цикл может ни разу не выполниться, но вам придется все равно выделить для него память (В+Г+Д и пр.) и это касается не только циклов, придется заранее выделять максимальный размер фрейма из возможных или двигать его в куче, что будет очень медленно.
ЭФ>Но не выделяем пока память под блоки для функций, вызываемых глубже (вассал моего вассала не мой вассал).
ЭФ>То есть, память выделяем не всю сразу, а на одно углубление по стеку.
Ну и работать такая оптимизация тоже будет только на одно углубление, т.е. для вызовов из тела цикла, а для функций вызывыемых глубже проблема остается.
ЭФ>Т.е. под функцию main выделяем блок, размер которого определяется переменными, которые использует main и размерами стеков функций,
ЭФ>которые main вызывает непосредственно.
В некоторых случаях память в стеке можно заранее не выделять, а выделить только когда потребуется, как здесь:
if (...) {
int a[1024]; // <--
//...
return;
}
а вам придется заранее резервировать память даже если условие не выполнится или переаллоцировать фрейм в куче.