【发布时间】:2017-05-26 13:13:00
【问题描述】:
假设一个方法正在改变一个通过引用传递的参数的值。此类操作的效果是在整个应用程序中立即可见还是仅在方法返回后可见?
下面是一个重要的例子:
int x = 0;
void Foo(ref int y)
{
++y;
Console.WriteLine(x);
}
Foo(ref x);
可以在http://csharppad.com/gist/915318e2cc0da2c2533dfa7983119869下的C#Pad中运行
函数Foo 可以访问变量x,因为它在同一个范围内,而且它恰好在调用站点接收到对它的引用。如果++y 的效果是即时的,则输出应该是1,但我可以想象一个编译器生成代码,例如,将本地值存储在寄存器中并在稍后返回之前转储到内存中。语言规范是否确保输出为1,还是允许抖动优化,使输出实现依赖?
【问题讨论】:
-
这给内置在即时编译器中的优化器带来了偏头痛。但在任何当前版本的抖动中都不足为奇,他们很清楚这个论点可能是一个别名,并且对此持悲观态度。 Fortran 仍然存在的一个原因是,这种别名是明确的。 GCC 中严格的别名规则更改导致lot of havoc。
标签: c# optimization semantics jit