在CPU寄存器中分配局部变量

时间:2015-01-06 13:46:11

标签: .net memory memory-management

实际上,我熟悉.NET框架的内存模型。

我有兴趣知道JIT编译器是否可以将局部变量放在CPU寄存器中以提高应用程序的性能,而不是在堆栈上分配变量?如果可以,这种分配的要求是什么,以及它如何决定是否执行?

1 个答案:

答案 0 :(得分:3)

这是由JIT一直在进行的。它是几乎所有JIT和本机编译器的标准优化。

不要将逻辑IL堆栈与jitted代码使用的物理x86堆栈混淆。他们的关系很弱。 IL堆栈内容和IL本地优选地存储在寄存器中,并且仅在需要时溢出到x86堆栈。

唯一的例外是在.NET 4.5 JIT和vNext RyuJIT(从VS2015预览版中)堆栈分配的结构。这没有记录,但测试清楚地表明,即使在最简单的情况下,结构也未被注册。也许我错过了一些情况,但这显然是一种罕见的情况。

根据我的测试,原始类型和对象引用始终存储在寄存器中(如果可用)。