内联函数的确切用法是什么?

时间:2010-08-24 06:47:54

标签: c++ function macros inline

  

可能重复:
  Benefits of inline functions in C++?

您好, 内联函数的确切用法是什么,内联函数究竟是做什么的。 在什么基础上程序员必须选择内联函数。 我用Google搜索了答案但仍然更喜欢stackoverflow。

3 个答案:

答案 0 :(得分:1)

函数内联是由编译器完成的性能优化

对于编译为机器代码的典型函数,您将拥有函数序言和Fepilogs。 prolog和epilog设置堆栈帧,保存寄存器,为本地分配空间,并根据调用约定执行其他任何操作。所有这些都需要CPU周期。对于非常小的函数(例如属性getter和setter),相对于函数中的实际工作,这个成本可能很高。这就是内联来节省一天的时间:)

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

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

相关的编译器概念是概述和部分内联(请参阅here),它试图将冷的,不经常遇到的代码块移出大型方法的主体,以便改善缓存行为,甚至为以下方法铺平道路内联概述的方法。

答案 1 :(得分:1)

C++ FAQ Lite的定义:

  

当编译器内联扩展函数调用时,函数的代码将被插入到调用者的代码流中(概念上与#define宏类似)。

     

这取决于其他很多东西,可以提高性能,因为优化器可以在程序上集成被调用的代码 - 将被调用的代码优化到调用者中。

有关示例和更多详细信息,请参阅同一页面。

答案 2 :(得分:0)

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

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

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

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