首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >内联函数

内联函数
EN

Stack Overflow用户
提问于 2009-03-15 19:44:31
回答 4查看 1.3K关注 0票数 9

什么是内联?

它是用来做什么的?

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 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内联。这背后的原因是调用的最终目标是未知的。

More on inlining

票数 27
EN

Stack Overflow用户

发布于 2009-03-15 19:46:42

有关内联的定义和讨论,请参阅see this question

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

附注:这个答案对于Java也是正确的。

票数 1
EN

Stack Overflow用户

发布于 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是一个更好的判断者。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/648409

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档