实际上,我熟悉.NET框架的内存模型。
我有兴趣知道JIT编译器是否可以将局部变量放在CPU寄存器中以提高应用程序的性能,而不是在堆栈上分配变量?如果可以,这种分配的要求是什么,以及它如何决定是否执行?
答案 0 :(得分:3)
这是由JIT一直在进行的。它是几乎所有JIT和本机编译器的标准优化。
不要将逻辑IL堆栈与jitted代码使用的物理x86堆栈混淆。他们的关系很弱。 IL堆栈内容和IL本地优选地存储在寄存器中,并且仅在需要时溢出到x86堆栈。
唯一的例外是在.NET 4.5 JIT和vNext RyuJIT(从VS2015预览版中)堆栈分配的结构。这没有记录,但测试清楚地表明,即使在最简单的情况下,结构也未被注册。也许我错过了一些情况,但这显然是一种罕见的情况。
根据我的测试,原始类型和对象引用始终存储在寄存器中(如果可用)。