【发布时间】:2012-04-15 06:05:30
【问题描述】:
我主要使用 C# 进行开发,但我认为这个问题可能也适用于其他语言。
另外,这里似乎有很多代码,但问题很简单。 em>
据我了解,内联是编译器(在 C# 虚拟机的情况下)通过在调用方法的每个位置插入方法主体来替换方法调用。
假设我有以下程序:
static Main()
{
int number = 7;
bool a;
a = IsEven(number);
Console.WriteLine(a);
}
...方法体IsEven:
bool IsEven(int n)
{
if (n % 2 == 0) // Two conditional return paths
return true;
else
return false;
}
我可以理解内联方法后代码的样子:
static Main()
{
int number = 7;
bool a;
if (number % 2 == 0)
a = true;
else
a = false;
Console.WriteLine(a); // Will print true if 'number' is even, otherwise false
}
一个明显简单而正确的程序。
但如果我稍微调整IsEven 的主体以包含绝对返回路径...
bool IsEven(int n)
{
if (n % 2 == 0)
return true;
return false; // <- Absolute return path!
}
我个人在某些情况下更喜欢这种风格。一些折射工具甚至可能会建议我将第一个版本更改为看起来像这个 - 但是当我试图想象这种方法被内联时会是什么样子时,我被难住了。
如果我们内联方法的第二个版本:
static Main()
{
int number = 7;
bool a;
if (number % 2 == 0)
a = true;
a = false;
Console.WriteLine(a); // Will always print false!
}
要问的问题:
编译器/虚拟机如何处理内联具有绝对返回路径的方法?
这样的事情似乎极不可能真正阻止方法内联,所以我想知道如何处理这些事情。也许内联的过程没有这么简单?也许一个版本更有可能被 VM 内联?
编辑:
分析这两种方法(以及第一种方法的手动内联)在性能上没有差异,所以我只能假设这两种方法都内联并以相同或相似的方式工作(至少在我的 VM 上)。
此外,这些方法非常简单,看起来几乎可以互换,但是具有绝对返回路径的复杂方法可能更难以更改为没有绝对返回路径的版本。
【问题讨论】: