_>Да, всё верно, с блоками слегка погорячился, это всё же накладная операция, действует в рамках вызова функций. Gcc поступает также, т.н. "Calling Convention".
Calling convention — это другое. Это правила передачи параметров функции (слева направо(сейчас нет уже, было в Win16) или справа налево, через стек и/или регистры, кто очищает стек при выходе (вызывающая или вызываемая). К отведению места в стеке под локальные переменные функции это отношения не имеет.
Ну и проблема не в том, что это накладная операция. Сейчас все локальные переменные — это просто смещения от ebp. Там таких ebp-const разбросано немало. Если же выделять память при каждом входе в блок, то одним ebp не обойдешься, придется целый менеджер памяти заводить, который будет определять адреса переменных на i-ом уровне вложенности фигурных скобок с учетом того, что было на всех предыдущих i-1 уровнях.