【发布时间】:2011-11-11 12:09:30
【问题描述】:
今天早些时候,当我正在编写一个方法时,我突然意识到我并不确定我正在实现的习语为什么会编译。如果其他所有内容都被抽象出来,它会看起来像这样:
private int Example()
{
while (true)
{
if (some condition)
{
return 1;
}
}
}
您有一个明确的无限循环,以及循环内的一些条件,这些条件导致循环以 return 语句结束。让我们暂时忽略为什么我这样做,而不是检查 while 子句中的终止条件,因为答案令人费解且无关紧要——我想知道的是为什么编译器不会用“不”来标记它所有路径都返回一个值。”错误,严格来说,并非所有路径都返回一个值。从未进入 while 循环(当然,永远不会发生)的情况不会返回任何内容。
现在,我可以想象它发生的原因有两个:这是由于其他原因而发生的优化的副作用,或者这种情况正在由编译器明确处理以允许使用这种习惯用法。我的直觉是,这可能是第一个案例。例如,编译如下:
private int Example2()
{
if (true) return 1;
}
因为编译器在 if 中看到了一个常量 true,并优化了条件。不过,我真的不明白为什么这会“修复”第一个示例。
哦,更奇怪的是,如果一些摆脱循环的优化正在发挥作用,它会编译:
private int Example3()
{
while (true)
{
if (false)
{
return 1;
}
}
}
我认为整个内部循环会被优化掉,去掉所有的有效返回。在字节码/编译器级别上到底发生了什么让这一切变得有意义?
【问题讨论】:
-
我认为最后一个例子是编译器说“我希望他们知道他们在做什么......”
-
+1 从未想过这些情况。
标签: c# .net visual-studio bytecode compiler-optimization