2010-08-24 33 views

回答

1

函数内联是由编译器

做对于编译成机器代码的典型功能,您将有功能prologs和Fepilogs性能优化。 prolog和epilog设置堆栈帧,保存寄存器,为本地分配空间,并根据调用约定做其他所需的任何操作。这样做需要CPU周期。对于非常小的函数(例如属性获取器和设置器),相对于函数中的实际工作,此成本可能较高。这是内联来节省一天的地方:)

内联函数是一个函数,您已经定义编译器决定直接包含到调用它的方法中,而不是生成call指令。换句话说,目标内联函数的实际机器代码被“内联”到调用方法的主体中。例如,如果Foo被称为BarBar被内联,并且您在调试器下运行了您的程序,您将看到Bar的指令Foo的正文。对于Bar的epilog和prolog可以被丢弃。

大多数情况下,您应该让编译器确定何时为您内联函数。内联不是神奇或自由的。它增加了代码大小和变量的实时范围,并且迫使编译器用更少的位置来处理更多的数据。正因为如此,编译器有一套复杂的启发式方法来确定成本何时值得。大多数编译器都允许内联提示。对于Visual Studio,请参阅inline, __inline, and __forceinline。然而,即使有了这些提示,编译器也可以自由地忽略你并做它想做的事情。

相关的编译器概念是概述和部分内联(见here),它试图将冷却的,不频繁的代码块移出大方法的主体,以改善缓存行为,甚至为内联概述铺平了道路方法。

+0

内联不一定会使代码膨胀。当内联调用时,编译器可以跳过组织调用的代码,因此内联实际上可以减少代码。 – sharptooth 2010-08-24 06:54:47

1

定义由C++ FAQ Lite

当编译器内联展开一个函数调用,该函数的代码被插入到调用方的码流(概念上类似于用#define宏发生)。

这可以根据数十万个其他事物来提高性能,因为优化程序可以程序化地集成被调用代码 - 优化被调用代码到调用者中。

查看同一页面的示例和更多详细信息。

0

http://www.parashift.com/c++-faq-lite/inline-functions.html

即使你指定inline标志,则编译器可能会忽略它。如果你正在编写一个库,并且对你想要提供的性能保证有深刻的思考(并对其进行了描述),那么你可以考虑将inline添加到你的函数或方法中。即使如此,也不能保证你会在编译的代码中看到任何不同,因为编译器可能已经决定内联它们,或者忽略你的请求。

有关性能的警告:内联并不总是会提高性能,因为它也会增加代码的大小。

配置您的应用程序,找到瓶颈,考虑算法级别的更改,并且只有当您需要在内部循环中挤出性能的最后一点时,才会尝试内联函数,展开循环或其他微观优化。

相关问题