- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我想知道 .maxstack 是如何工作的。我知道这与您声明的类型的实际大小无关,而是与它们的数量有关。我的问题是:
最佳答案
.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
回答您的问题:
- does this apply just for the function, or to all the functions that we are calling for?
只是为了功能
- even if it's just for the function were .maxstack is being declared, how do you know what maxstack is if you have branching? You go and see all the "paths" and return the maximum value possible?
你去看看所有的路径并返回可能的最大值
- What happens if I set it to 16 and actually there are 17 variables?
与变量个数无关,见Lasse V. Karlsen的回答
- Is there a too big of a penalty if I set it to 256?
这似乎不是个好主意,但我不知道。
您真的必须自己计算.maxstack
吗? System.Reflection.Emit
为您计算 IIRC。
关于c# - .NET IL .maxstack 指令如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1241308/
我不是任何类型的 IL 大师,我只是有时用它来检查编译器对我编写的代码的处理情况。我一直想知道的一件事是为什么 .maxstack 有时会得到它得到的值。考虑以下类: public class Sam
我在 Debug模式下编译了一些测试代码,并用 ILSpy 反射(reflect)了生成的程序集。这是我得到的 IL: .class private auto ansi beforefieldinit
如何使用 ILGenerator 设置 .maxstack 指令? 例如,典型的 setter 方法的 .maxstack 为 2: .maxstack 2 // The evalua
我想知道 .maxstack 是如何工作的。我知道这与您声明的类型的实际大小无关,而是与它们的数量有关。我的问题是: 这是否仅适用于功能,或所有功能我们呼吁的是什么? 即使只是为了功能正在声明 .ma
我在业余时间学习汇编语言。谁能解释为什么 .maxstack 在这个程序中似乎是可选的。我试图在网上和我的书中找到答案,但没有这样的运气,即程序将编译并运行 .Maxstack 注释掉: //Add.
我可以编写、编译并成功运行以下 IL 程序,并将 .maxstack 大小设置为 1,该值太低,因为该程序在某个时间点堆栈上有两个值(即 2+2==4) 。该程序不会在 CLR 中崩溃,并以“Hell
我很想了解在 Debug 和 Release 模式下生成的 IL 代码之间的区别。我写了一个简单的代码。 using System; namespace Console
我在尝试加载我使用 ASM 生成的类时收到预期的 ClassVerifyErrors。在进一步检查中,我可以看到 jvm 是正确的,并且所讨论的方法具有无效的 MAX_STACK 值。奇怪的是我正在使
我是一名优秀的程序员,十分优秀!