内联函数

时间:2009-03-15 19:44:31

标签: c# inlining

什么是内联?

它用于什么?

你能用C#内联吗?

4 个答案:

答案 0 :(得分:27)

它是什么

在C和C ++方面,您使用inline关键字告诉编译器调用例程而不会将参数压入堆栈。而函数将其机器代码插入到调用它的函数中。在某些情况下,这可以显着提高性能。

<强>危险

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

在C#中内联

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

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

More on inlining

答案 1 :(得分:1)

关于内联的定义和讨论,see this question

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

P.S。这个答案对Java也是正确的。

答案 2 :(得分:1)

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

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

Vance有一篇很好的文章,介绍JIT在内联时所考虑的内容:http://blogs.msdn.com/vancem/archive/2008/08/19/to-inline-or-not-to-inline-that-is-the-question.aspx

无法在C#中强制内联。该语言不支持此结构。主要是因为人们对什么应该优化的判断非常差。 JITer是一个更好的判断。

答案 3 :(得分:0)