如何在C#中强制使用内联函数?

35

可能是重复问题:
C#中的内联函数?

在C ++中,我们可以强制实现函数内联

那么在C#中是否也可以呢?有时候,当方法很小的时候,它会自动内联。但是有没有办法强制在C#/.Net中进行函数内联呢?


如前所述,重复的代码不要出现。JIT编译器非常擅长此类优化,并拥有非常好的算法。如果让它自己处理,性能会更好。 - marr75
3
自 .net 4.0 起,内联算法相当愚笨。它经常做出糟糕的决定。能够手动覆盖这些决定会很不错。 - CodesInChaos
各位,有没有什么方法可以强制相反的操作?(例如,使一个函数不被内联?) - BrainSlugs83
4
具有讽刺意味的是,现在在谷歌搜索“C# request inline”时,这个回答排名第一。 - Pharap
3
这里有一个应用案例:如果你将检查许可证或类似内容的内联代码,则任何黑客现在都必须删除更多的代码,而不仅仅是所有调用的一个方法。 - CAD bloke
显示剩余2条评论
1个回答

81
有点像。确保打开它不在您的直接控制下。它从未内联在IL中 - 只有JIT才能完成。
您可以使用MethodImplAttribute显式地强制方法不内联。
[MethodImpl(MethodImplOptions.NoInlining)]
public void Foo() { ... }

从.NET 4.5开始,您还可以以某种方式“请求”内联:

[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void Foo() { ... }

......但你不能强制它。(在.NET 4.5之前,该枚举值不存在。例如,请参阅.NET 4文档。)


4
不错,我不知道有这个新的枚举值。在我的一些高性能代码中可能会很有用。 - CodesInChaos
为什么它不提供强制内联,只提供建议/请求? - WDUK
@WDUK无法强制内联,这是因为在我所知道的任何语言中都不能强制内联;例如,你认为递归函数应该如何内联?因此,在C#、C++等语言中,程序员能做的最多就是向编译器提供一个提示,表明如果可能的话,这个方法应该被内联。 - Thomas Flinkow
9
如果您请求使用强制内联,我原本认为它要么无法编译成功,要么会产生错误的结果。这将由开发者决定何时使用强制内联和何时不使用。 - WDUK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接