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