内联和良好实践

时间:2011-01-11 09:16:11

标签: c++ coding-style inline

  

可能重复:
  When to use inline function and when not to use it ?

我看过很多源代码使用了与inline指令不同的语法。

namespace Foo
{
    class Bar
    {
        public:

            // 1 - inline on the declaration + implementation
            inline int sum1(int a, int b) { return a + b; }

            // 2 - inline on template declaration + implementation
            template <typename T>
            inline T sum2(T a, T b) { return a + b; }

            // 3 - Nothing special on the declaration...
            int sum3(int a, int b);
    };

    // 3 - But the inline directive goes after
    // In the same namespace and still in the header file
    inline int Bar::sum3(int a, int b) { return a + b; }
}

我没有找到关于inline使用的“官方”指南:我只知道inline只是对编译器的一个暗示,并强制执行内部链接我对此一无所知。

以下是我的问题:

  • (1)良好做法吗?
  • 在(2)中,总是需要inline指令吗? (我的猜测是“不”,但我无法解释原因)。什么时候需要?
  • (3)似乎是最常用的语法。它有什么问题或者我也应该使用它吗?
  • 我不知道inline还有其他用途(语法)吗?

4 个答案:

答案 0 :(得分:10)

不,不! inline不是只是对编译器的提示,它不会强制执行内部链接。

inline隐含在类主体中定义的函数上,因此您只需要在类外定义的函数上。只有当您需要对inline生成的一个定义规则进行更改时,才应使用它。

答案 1 :(得分:3)

关于你的问题:

  1. 这似乎不是一个好用法,因为在类的主体中实现的任何成员函数都是内联隐式标记的。换句话说,这种特定的内联声明是多余的。也就是说,这个函数本身是内联的一个很好的选择,因为它很小,很短,并且可能使用更多的汇编指令来调用而不是执行。

  2. 这里没有必要使用内联关键字两个原因。首先,函数是在类的主体中实现的成员函数,因此它是隐式内联的。其次,该函数是一个模板,如果它们是非模板函数,您只需要在标题内联中标记函数。但是,由于上面给出的原因,这实际上是内联函数的一个很好的候选者。

  3. 这是内联函数的绝佳选择,您可以在这里完美地使用关键字。这是一个很短的功能,可以从中受益。

  4. 不,这就是所有语法用法。你似乎知道你在做什么! :-)

答案 2 :(得分:1)

除了在头文件中完全实现自由函数之外,不需要使用inline关键字。这指示链接器应允许存在此函数的多个(重复)符号,并且链接器应将此减少为一个实例。

答案 3 :(得分:0)

默认情况下,如果在类中声明并定义一个函数,它将是内联的。内联是对编译器的请求,编译器决定它是否内联。在内联的情况下,函数体在调用它的代码中展开。如果函数很大并且有多个循环和switch情况,那么编译器会忽略内联请求并将其视为简单函数。 简单来说,内联行为与预处理器相同,但优点和缺点是不同的。