我想知道.maxstack是如何工作的。我知道这与您声明的类型的实际大小无关,而与它们的数量有关。我的问题是:
功能,或所有功能
我们在呼吁什么?
声明了.maxstack,
你怎么知道什么是最大堆栈
你有分支吗?你去看看
所有的“路径”并返回
可能的最大值?
其实有17个变数?
将其设置为256?
最佳答案
.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
要回答您的问题:
只为功能
您去查看所有路径并返回可能的最大值
它与变量的数量无关,请参阅Lasse V. Karlsen的答案
似乎不是个好主意,但我不知道。
您真的需要自己计算
.maxstack
吗? System.Reflection.Emit
为您计算IIRC。