В main () можно выделить большой объем памяти из стека, и ваш код будет перераспределять его позже. Это глупо, поскольку это означает, что ваша программа занимает память, которая ей на самом деле не нужна.
Я не могу думать ни о какой причине (кроме какой-нибудь глупой задачи по программированию или учебного упражнения), желающей избежать кучи. Если вы «слышали», что выделение кучи медленное, а выделение стека быстрое, это просто потому, что куча включает динамическое распределение . Если бы вы динамически выделяли память из зарезервированного блока в стеке, это было бы так же медленно.
Распределение стека легко и быстро, потому что вы можете освободить только самый младший элемент в стеке. Это работает для локальных переменных. Это не работает для динамических структур данных.
Редактировать: увидев мотивацию вопроса ...
Во-первых, куча и стек должны конкурировать за одинаковое количество доступного пространства. Как правило, они растут навстречу друг другу. Это означает, что если вы как-то перенесете все свое использование кучи в стек, то вместо того, чтобы стек сталкивался с кучей, размер стека будет просто превышать объем доступной оперативной памяти.
Я думаю, вам просто нужно следить за использованием кучи и стека (вы можете захватить указатели на локальные переменные, чтобы получить представление о том, где в данный момент находится стек) и, если он слишком высок, уменьшить его. Если у вас есть много небольших динамически размещаемых объектов, помните, что у каждого выделения есть некоторые накладные расходы памяти, поэтому перераспределение их из пула может помочь сократить требования к памяти. Если вы где-нибудь используете рекурсию, подумайте о ее замене решением на основе массива.