在IL中,您可以使用.locals
指令定义局部变量。这些变量在哪里存储,堆栈或堆?.NET局部变量存储在哪里?
回答
这是非常多的JIT编译器的实现细节。它会尽力将局部变量存储在CPU寄存器中,非常高效。如果没有足够的寄存器可用于存储所有本地变量,堆栈就是常用的后备存储。在x86和x64抖动之间例如
很大的区别。 x64有更多的寄存器可用。这也适用于传递给方法的参数。 x86允许2通过一个CPU寄存器,x64允许4.加上任何可以存储在FPU堆栈或XMM寄存器中的内容。所以,实际上有四个不同的地方可以存储局部变量。
如果对象不是值类型,它是在堆上分配和对它的引用被存储在堆栈中。否则,它直接分配在堆栈上。
在堆栈的参数。 .. BUT .....
1)对于引用类型,只有参考存储在堆栈不是对象其参照上。实际的对象存储在堆上。
2)对于值类型,实际值存储在堆栈上。
现在,当在所述方法中执行流到达关闭支架堆栈上的值的类型的数据被破坏那里,然后,同时在堆上引用类型的对象(其引用在这里该方法的堆栈上)是交由垃圾收集系统在垃圾收集器本身决定的适当时间收集。
这也太出于同样的原因,如标记的答案非常误导。另外,绝对没有破坏正在发生。无论是在IL还是机器代码中。堆栈位置简单地被放弃并最终被另一个激活堆栈框架覆盖。即使引用类型在堆上的概念也不准确。实际的字符串实际上存储在加载器堆中,静态变量保存的地方。细节,细节。 – 2010-09-29 15:20:14
@Hans:感谢您的详细资料......感谢您的解释。 – explorer 2010-09-29 15:54:11
- 1. FORTRAN在哪里存储局部变量?
- 2. 变量存储在哪里?
- 3. 在哪里存储局部变量? NSKeyedArchiver或NSUserDefaults?
- 4. Java最终局部变量存储在哪里?
- 5. 方法局部变量存储在哪里?
- 6. 存储在内存中的DLL的全局变量在哪里?
- 7. 静态存储在内存中的全局变量在哪里?
- 8. .NET“独立存储”存储在哪里?
- 9. 在PHP中,全局声明的变量存储在哪里?
- 10. 挥发性变量存储在哪里?
- 11. Python中的变量存储在哪里?
- 12. $ _SESSION变量存储在哪里?
- 13. nodejs在哪里存储变量?
- 14. 在哪里存储javascript变量
- 15. selenium webdriver:存储变量在哪里?
- 16. JSFiddle在哪里存储我的变量?
- 17. golang环境变量存储在哪里?
- 18. 全局变量像$ _GLOBAL,$ _POST等存储在哪里?
- 19. Firefox 49开发工具,其中“存储为全局变量”存储在哪里?
- 20. .NET - 将URL存储为全局变量
- 21. 存储在变量栈中的变量在哪里?
- 22. 全局设置存储在哪里?
- 23. 本地,全局,静态,自动,寄存器,外部,常量,易失性变量存储在哪里?
- 24. 在哪些内存中存在静态变量,局部变量是否存在?
- 25. Python 3如何存储局部变量?
- 26. 哪里是内部存储,手机存储和外部存储
- 27. 哪个更好? - ViewState中Web控件的局部变量或存储变量
- 28. c中存储的常量volatile变量在哪里?
- 29. 如何知道寄存器变量存储在哪里?
- 30. 哪一部分在C++可执行文件中存储全局常量变量?
+1,当谈到IL时,对于当地人和参数有很多混淆。 IL与一个操作栈协同工作,但这并不直接对应于一个“调用栈”,比如C编译器用'cdecl'或'stdcall'调用约定生成的调用栈。参数和当地人都被视为编号插槽;与调用堆栈相似的唯一区域是何时从操作堆栈中弹出用于加载到方法调用的参数槽中的方法调用参数。 – 2010-09-29 15:24:18