【发布时间】:2012-01-03 14:04:29
【问题描述】:
CLR 编译器/JIT 是否执行了任何转义分析?例如,在 Java 中,a loop variable 一个在循环中分配的对象似乎不会逃脱循环,而是分配在堆栈而不是堆上(请参阅Escape analysis in Java)。
为了澄清,在下面的示例中,编译器是否会优化 foo 的堆分配,因为它永远不会逃脱循环。
class Foo
{
int number;
Foo(int number) { this.number = number; }
public override string ToString() { return number.ToString(); }
}
for (int i = 0; i < 10000000; i++)
{
Foo foo = new Foo(i);
Console.WriteLine(foo.ToString());
}
【问题讨论】:
-
通常,循环变量是一种值类型,它在堆栈上分配(在循环的情况下)。
-
我的意思是在循环体内分配的变量。我将更新问题以澄清。
-
你的意思是变量吗?还是对象? (概念上非常不同)
-
您的
ToString()不正确;那应该是public override ToString()- 强调override。 -
是的,我指的是对象,而不是变量。我认为对问题的 Java 版本的引用会推断出这一点,但我应该使用正确的术语。你在
ToString()上一如既往地正确,我会修复代码...
标签: c# optimization clr jit escape-analysis