我的 C++ 内联方法是否应该显式声明为内联?

Should my C++ inline methods be explicitly declared as inline?

(我使用的是 gnu g++ v5.2.1 和 C++11,但这是一个通用的 C++ 问题。)

我想在我的 .hpp 文件中加入一些简单的方法。我项目中的许多 .cpp 文件都包含这个 .hpp 文件:

class foo
{
    public:

        int        example1( int i ) { return i + 5; }
        inline int example2( int i ) { return i + 5; }
};

example1()example2() 一个显式声明 inline 而另一个没有提到 inline 有区别吗?

我应该更喜欢一个吗?


编辑:不,@HostileFork,您标记为可能重复的其他问题没有回答我的问题。

我认为这取决于 C++ 编译器的选项。如果优化级别高,一些微小的函数将被优化为内联。

在您的例子中,函数 example2 非常简单,关键字 inline 就可以了。例如 1,如果优化级别很高,它可能会被编译为内联,但这取决于编译器的行为。如果禁用优化选项,它将不是内联函数。

在我看来,关键字inline是给编译器的一个建议,如果函数比较复杂,可能没有效果。

在 class 定义中带有 body 的成员函数隐式 inline,因此您的两个代码示例是相同的。

但是如果提供了body就不一样了 out-of-line:

class foo
{
    public:
        int example1( int i );
        inline int example2( int i );
};

在此代码中,foo::example2 是一个内联函数。 out-of-line定义必须也出现在header中(除非函数永远不会odr-used)。 out-of-line 定义是否还包括 inline 说明符是可选的。

对于foo::example1,如果有一个out-of-line定义带有inline说明符,那么函数就是inline。同样,如果存在这样的定义,那么它必须在 header 中,除非函数永远不会是 odr-used

这些 ODR 违规是未定义的行为,不需要诊断。在实践中,这可能意味着它可能 "appear to work",或者给出 link 错误。


通常,您只会使用我的 example2 案例,您希望函数定义出现在 header 中,但您认为 class 定义紧凑更易读以及稍后的函数 body。

在这种情况下,我建议在声明和定义中都使用 inline,以增强可读性。

Windows 编程注意事项: 如果 class 标记为 __declspec(dllexport)__declspec(dllimport),则 gcc 会警告 example1。我不确定这里的正确行为是什么,但为了避免任何可能的问题,请在声明中使用 inline

Member functions defined in-class are inline by default.

https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#note-38