tyomitch
Строки и объекты слишком большие, чтобы хранить их в стеке.
Строки и объекты не имеют фиксированного размера, и поэтому при обращении к соседним элементами придётся учитывать как-то размер строк и объектов.
Объект, созданный в процедуре, может быть убить до выхода из этого экземпляра процедуры, а может продолжить жить, и быть убитым на выходе из программы.
В первом случае, в стеке останется дыра, и придётся как-то дефрагментировать его. Это не есть хорошо.
Во втором случае объект останется в стеке. Тогда будет риск что какие-то другие процедуры (особенно рекурсивные) затрут этот объект.
Это опять лишний неэффективынй код.
По этим причинам объекты и строки хранят в других управляемых структурах памяти (в кучах. В кучах как класс. Не обязательно в виндовых кучах. Может быть свой алгоритм управления данными. --На случай если попробуешь придраться, сказав что "что-нибудь" не юзает виндовую кучу для хранения чего-либа)
байты, ворды, дворды, кьюворды и подобные небольшие структуры наоборот эффективно хранить в стеке.
В любом случае, стек необходим и для строк и для объектов, потому что указатели на них (на строки и объекты) всё равно хранятся (хранят... их... там... обычно. Ибо эффективно) в стеке.
На всякий случай, ещё одно уточнение: локальная переменная создаётся тогда, когда происходит вход в содержащую её процедуру, и уничтожается тогда, когда эта переменная больше никому не нужна. В частности, если компилятор может гарантировать, что после выхода из функции она уже не будет никому нужна (например, если внутри функции не было вложенных методов), -- тогда она уничтожится при выходе из функции.
Ещё раз: если следовать этой логике, переменная, которая будет кому-то нужна после выхода функции останется в стеке, и будет там. Есть риск что её кто-то затрёт. Поэтому, так нельзя делать.
Ну, и полурелигиозный вопрос: зачем вообще хранить локальные переменные в стеке?
А где их хранить?
Создавать в EXE-файле секцию для локальных переменных?
Плохо, ибо:
1) Увеличивается размер EXE-файла.
2) Это не позволит использовать рекурсии.
3) В многопоточных приложениях появится ещё больше геморроя, потому что все подобные локальные переменные ни чем не будут отличаться от глобальных. И две (или более) одновременно работающие процедуры (без всяких даже рекурсий, просто несколько процедур, работающих в разных потоках) будут портить друг-другу локальные переменные.
Выделять под это дело память в ран-тайме?
Плохо, ибо:
1) Нужно где-то хранить указатели на области памяти для каждого экземпляра, в которых находятся ЛП для них (для экземпляров).
Для этого всё равно придётся либо использовать стек (в чём тогда смысл подобного изврата - при обращении к памяти придётся только лишний раз учитывать смещение области памяти ЛП.
Либо не использовать стек, а класть эти адреса в другое место, единожды, для каждой процедуры. В этом случае опять придётся отказаться от рекурсий вообще.
2) Проблема с рекурсией (вытекает из п.1)
3) Проблема с многопоточностью (вытекает из п.1)
4) Будет неэффективно жраться память под ЛП-фреймы экземпляров функций.
Использовать кучу (виндозную либо свою)?
Плохо, ибо:
1) Кучи - слишком интеллектуальны. Они решат все выше-описанные проблемы. Однако стек имеет обыкновение расти и уменьшаться последовательно. Кучи же предусматривают возможность эффективного занатия/освобождения регионов кучи. При попытке программы заАЛЛОЧить себе 10 байт памяти менеждер куч будет искать наименьшую "дырку" в куче, куда поместятся эти 10 байт, и, в случае если такой дырки не окажется, расширять кучу - коммитить новую страницу. Для памяти, использующеся в качестве стека вызовов и для хранения ЛП-фреймов, эта интеллектуальность излишняя - в этой памяти гарантированно не может быть дырок (описанные тобою случае жития переменной после выхода их процедуры - не в счёт
). АЛЛОКейтинг всегда должен всегда выделять регион кучи в конце регионов. Регионы будут стоять вполтную и дырок между ними оказаться не может (я уже повторяюсь).
В итоге - виндовые кучи слишком избыточны (и медленны) для наших целей.
Мы можем написать свой собственный менеждер своей собственной кучи. И мы получим структуру, ни чем не отличающуюся от обычного стека, который ты недолюбливаешь, непонятно почему
Фух. Блин. И так некогда, а ещё увлёкся написанием постинга