Ответ 1
Компилятор резервирует пространство стека для экземпляра MemBlock
при каждом вызове foo
, независимо от потока управления внутри foo
. Это обычная оптимизация, чтобы не допустить повторной настройки указателя стека внутри этой функции. Вместо этого компилятор вычисляет максимальное требуемое пространство стека и при входе в функцию настраивает указатель стека на эту сумму.
Как вы заметили, это приводит к потере пространства стека, зарезервированного для объектов, которые вы на самом деле не используете. Ответ заключается в том, чтобы не делать этого; если вы используете только некоторые объекты с большими отпечатками в определенных ветвях, тогда отделите эти ветки на свою собственную функцию.
Кстати, именно поэтому архаичные версии C требовали, чтобы все переменные-функции были объявлены в верхней части функции; так что компилятор может легко определить, сколько пространства стека требуется функции.