C# 内联函数

C# 内联函数,c#,inlining,C#,Inlining,什么是内联 它是用来干什么的 你能用C#内联一些东西吗?来定义和讨论内联 在C#中,您不需要指示编译器或运行时内联,因为运行时会自动执行 另外,这个答案对于Java也是正确的。它是什么 在C和C++中,你使用内联关键字告诉编译器调用一个例程,而不必将参数推送到堆栈上。相反,该函数将其机器代码插入调用它的函数中。在某些情况下,这会显著提高性能 危险 随着内联函数大小的增加,使用“内联”的速度优势显著降低。过度使用实际上会导致程序运行较慢。内联一个非常小的访问器函数通常会减少代码大小,而内联一个非常

什么是内联

它是用来干什么的


你能用C#内联一些东西吗?

来定义和讨论内联

在C#中,您不需要指示编译器或运行时内联,因为运行时会自动执行


另外,这个答案对于Java也是正确的。

它是什么

在C和C++中,你使用内联关键字告诉编译器调用一个例程,而不必将参数推送到堆栈上。相反,该函数将其机器代码插入调用它的函数中。在某些情况下,这会显著提高性能

危险

随着内联函数大小的增加,使用“内联”的速度优势显著降低。过度使用实际上会导致程序运行较慢。内联一个非常小的访问器函数通常会减少代码大小,而内联一个非常大的函数则会显著增加代码大小

C#中的内联

在C#中,内联发生在JIT编译器做出决定的JIT级别。目前在C#中没有可以显式执行此操作的机制。如果您想知道JIT编译器正在做什么,那么可以在运行时调用:
System.Reflection.MethodBase.GetCurrentMethod().Name
。如果方法是内联的,它将返回调用方的名称

在C#中,不能强制方法内联,但可以强制方法不内联。如果您确实需要访问特定的调用堆栈,并且需要删除内联,则可以使用:
methodimpltAttribute
methodimpltoptions.noinline
。另外,如果一个方法被声明为虚拟的,那么它也不会被JIT内联。这背后的原因是调用的最终目标未知


内联是指不调用特定函数,而是直接在调用站点完成函数的内容。这样做的主要原因是,它通过在调用站点运行函数内容来消除调用函数的开销

它被用作一种优化技术。在C#的情况下,实际上取决于CLR JIT引擎来完成这项工作。在运行时,当编译方法时,JIT引擎将使用启发式方法来确定函数内联是否合适,是否是有效的优化。如果是,则执行内联

Vance有一篇关于JIT在内联时考虑什么的文章:


没有办法在C#中强制内联。该语言不支持此构造。主要是因为人们对应该优化什么的判断很差。神经过敏者是一个更好的裁判

引用Eric Gunnerson的话


更准确地说,你不是“告诉编译器”,而是“向编译器提出一个建议,它可能会注意,也可能不会注意。”从.NET 4开始(我认为),你实际上可以强制内联。为此,
MethodImplOptions
现在有一个
aggressiveInline
值。另请参见此问题: