【问题标题】:c++ inline functionsc++ 内联函数
【发布时间】:2010-04-29 16:33:25
【问题描述】:

我对如何在 C++ 中执行内联函数感到困惑....

让我们说一下这个功能。怎么转成内联函数

int maximum( int x, int y, int z )
{
   int max = x;
   if ( y > max )
      max = y;
   if ( z > max )
      max = z;
   return max;
}   

【问题讨论】:

  • 把“inline”放在函数定义前面。
  • 您还必须将函数定义放在标题中(或以其他方式使其在每个翻译单元中可用...
  • 请记住,inline 关键字通常对函数是否内联没有影响,对于任何合理的现代编译器来说。它将允许您在多个位置定义函数,只要所有定义都相同(例如,如果它是 inline,您可以在多个标题中定义该函数)。
  • 您也可以使用return (x > y ? (x > z ? x : z) : (y > z ? y : z));。也许这就是问题的意图?
  • 你也可以把它做成一个函数模板,这可能比使用inline更可靠。

标签: c++ inline-functions prototype


【解决方案1】:

为了把它变成一个内联函数,你需要做两件事:

  1. 使用关键字inline 将其声明为内联。
  2. 确保该函数的定义在使用它的每个翻译单元中都是可见的。这通常意味着您必须将函数的整个定义放入头文件中。

【讨论】:

    【解决方案2】:

    正如其他人所说,您可以使用 inline 关键字告诉编译器您希望内联函数。但是inline 关键字只是一个编译器提示。如果编译器愿意或需要,它可以并且会选择忽略您的请求。

    另一种方法是让你的函数成为一个函数模板,这通常会被内联:

    template<class Val>
    Val maximum( Val x, Val y, Val z )
    {
       Val max = x;
       if ( y > max )
          max = y;
       if ( z > max )
          max = z;
       return max;
    }   
    

    【讨论】:

    • 函数模板不一定是内联展开的。
    • Niether 是 inline 函数。这只是一种替代方法。
    • Andrey 的回答更好……作为模板与inline 或内联没有任何关系。模板和内联函数往往放在头文件中只是巧合。 Andrey 解释了这一点……最好不要鼓励无意义的模板化。
    【解决方案3】:

    将尼尔斯的答案作为实际答案发布:

    inline int maximum(int x, int y, int z)
    ....
    

    【讨论】:

      【解决方案4】:

      如果该函数定义出现在 class {} 定义中,则它已经自动内联。

      否则,正如其他人所说,将inline放在前面。

      【讨论】:

        【解决方案5】:

        要使函数内联,请使用 inline 关键字:

        inline int maximum( int x, int y, int z ) // note the inline keyword
        {
           int max = x;
           if ( y > max )
              max = y;
           if ( z > max )
              max = z;
           return max;
        }
        

        如果函数是类/结构的成员,那么只需在类内定义它(与类外相对)使其内联。

        假设你有电话:

        int f = maximum(3, 4, 5)
        

        编译器可能会将调用扩展为:

        int max = x;
        if ( y > max )
           max = y;
        if ( z > max )
           max = z;
        int z = max;
        

        调用函数会产生一些开销,因此内联函数为您提供函数的便利性以及 C 宏的性能。但这并不是说您应该始终使用它们,在大多数情况下,编译器更擅长决定何时需要进行此类优化,甚至可能不会满足您的要求。

        您可以在C++ FAQ Lite 和此GotW 阅读有关内联函数以及如何(以及何时)使用它们的更多信息

        【讨论】:

          【解决方案6】:

          inline 只是告诉编译器您希望将函数代码复制到它所引用的任何地方,它使代码更快(没有函数调用开销)但更大(代码被复制)。 This page is more in depth.

          【讨论】:

          • 如果不喜欢,编译器不需要实际内联它。所以它可能有帮助,也可能没有帮助。
          猜你喜欢
          • 2017-01-05
          • 2011-08-23
          • 2014-12-24
          • 1970-01-01
          • 2023-03-10
          • 2011-03-07
          • 2010-11-06
          • 2014-11-05
          相关资源
          最近更新 更多