我想知道.maxstack是如何工作的。我知道这与您声明的类型的实际大小无关,而与它们的数量有关。我的问题是:

  • 是否仅适用于
    功能,或所有功能
    我们在呼吁什么?
  • 即使仅用于该功能
    声明了.maxstack,
    你怎么知道什么是最大堆栈
    你有分支吗?你去看看
    所有的“路径”并返回
    可能的最大值?
  • 如果将其设置为16并且
    其实有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。

    10-06 02:38