内联函数

内联是什么?

它是干什么用的?

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

这是什么

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

危险

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

在C#中内联

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

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

更多关于内联

有关内联的定义和讨论, 请参阅此问题 。

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

PS这个答案对Java来说也是正确的。

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

它被用作优化技术。 在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是一个更好的判断。

引用Eric Gunnerson

内联发生在JIT级别,JIT通常做出正确的决定