Размер стека для типов значений
Все говорят, что типы значений хранятся в стеке. Но каков размер стека, в котором хранятся типы значений? Никто не объясняет об этом.
2 ответа
Задача джиттера - вычислить размер кадра стека для метода. Это довольно прямое добавление суммы размеров всех локальных переменных в методе. Все типы малых значений занимают 4 байта, длинные и двойные - 8, десятичные - 16, структура принимает суммарный размер своих выровненных членов. Ссылки ссылочного типа занимают 4 байта в 32-битном режиме, 8 байтов в 64-битном режиме.
Дальнейшее уточнение заключается в том, что оптимизатор джиттера может перемещать локальные переменные в регистры ЦП, ускоряя код и уменьшая требуемое хранилище кадров стека, если его не нужно разливать.
Сумма размеров кадров стека для вложенных вызовов методов плюс накладные расходы сохраненных регистров процессора, адреса возврата и аргументов метода не могут превышать выделенный размер стека. По умолчанию один мегабайт для 32-битного кода, четыре мегабайта для кода, скомпилированного с x64 в качестве цели. Или аргумент maxStackSize конструктора класса Thread. Превышение выделенного размера приводит к фатальному исключению, для которого этот сайт назван.
Фактический результат во многом зависит от используемого джиттера, x86 против x64 против ARM. И используется ли сборка Debug или Release. Таким образом, вы должны считать это полной реализацией.
Размер стека настраивается и может быть установлен несколькими различными способами.
По умолчанию установлено 1 MB
, Для приложений ASP.NET это 256 KB
( больше информации здесь).