【发布时间】:2009-03-15 19:44:30
【问题描述】:
什么是内联?
它是做什么用的?
你能在 C# 中内联一些东西吗?
【问题讨论】:
-
另见这个问题:stackoverflow.com/questions/473782/inline-functions-in-c>
什么是内联?
它是做什么用的?
你能在 C# 中内联一些东西吗?
【问题讨论】:
它是什么
在 C 和 C++ 中,您使用 inline 关键字来告诉编译器调用例程,而无需将参数压入堆栈的开销。相反,函数将其机器代码插入到调用它的函数中。这可以在某些情况下显着提高性能。
危险
随着内联函数大小的增加,使用“内联”的速度优势会显着降低。过度使用实际上会导致程序运行速度变慢。内联非常小的访问器函数通常会减少代码大小,而内联非常大的函数会显着增加代码大小。
C# 中的内联
在 C# 中,内联发生在 JIT 编译器做出决定的 JIT 级别。目前 C# 中没有可以显式执行此操作的机制。如果您想知道 JIT 编译器在做什么,那么您可以在运行时调用:System.Reflection.MethodBase.GetCurrentMethod().Name。如果方法是内联的,它将返回调用者的名称。
在 C# 中,您不能强制方法内联,但可以强制方法不内联。如果您确实需要访问特定的调用堆栈并且需要删除内联,您可以使用:MethodImplAttribute 和 MethodImplOptions.NoInlining。此外,如果一个方法被声明为虚拟,那么它也不会被 JIT 内联。这背后的原因是调用的最终目标是未知的。
【讨论】:
MethodImplOptions 现在有一个 AggressiveInlining 值用于此目的。
【讨论】:
内联是指不调用特定函数,而是直接在调用站点完成函数的内容。这样做的主要原因是它通过在调用点运行函数内容来消除调用函数的开销。
它被用作一种优化技术。对于 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 是一个更好的判断者。
【讨论】: