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

Allocating local variables in CPU registers

其实我对.NET framework的内存模型比较熟悉。

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

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

不要将逻辑 IL 堆栈与 jitted 代码使用的物理 x86 堆栈混淆。它们的相关性非常弱。 IL 堆栈内容和 IL 局部变量最好存储在寄存器中,仅在需要时才溢出到 x86 堆栈。

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

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