.maxstack
является частью проверки IL. В основном .maxstack
сообщает JIT максимальный размер стека, который он должен зарезервировать для метода. Например, x = y + (a - b)
переводится как
(псевдо IL:)
1. Push y on the stack
2. Push a on the stack
3. Push b on the stack
4. Pop the last two items from the stack,
substract them and
push the result on the stack
5. Pop the last two items from the stack,
add them and
push the result on the stack
6. Store the last item on the stack in x and
pop the last item from the stack
Как видите, в стеке не более 3 предметов одновременно.
Если вы установите для .maxstack
значение 2 (или меньше) для этого метода, код не запустится.
Кроме того, вы не можете получить что-то подобное, так как для этого потребуется бесконечный размер стека:
1. Push x on the stack
2. Jump to step 1
Чтобы ответить на ваши вопросы:
- это относится только к функции или ко всем функциям, к которым мы обращаемся?
Только для функции
- , даже если это только для функции, в которой объявляется .maxstack, как узнать, что такое maxstack, если у вас есть ветвление? Вы идете и видите все «пути» и возвращаете максимально возможное значение?
Вы идете и видите все пути и возвращаете максимально возможное значение
- Что произойдет, если я установлю 16, а на самом деле будет 17 переменных?
Это не связано с количеством переменных, см. Lasse V. Karlsen ответ
- Будет ли слишком большой штраф, если я установлю его на 256?
Не похоже на хорошую идею, но я не знаю.
Вы действительно должны рассчитать .maxstack
самостоятельно? System.Reflection.Emit
рассчитывает для вас IIRC.