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

时间:2016-03-30 01:59:27

标签: c++ c++11 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,您标记为可能重复的其他问题不会回答我的问题。

3 个答案:

答案 0 :(得分:3)

在类定义中包含其主体的成员函数是隐式inline,因此您的两个代码示例是相同的。

然而,如果身体是在线外提供的话会有所不同:

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

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

对于foo::example1,如果有inline说明符的外联定义,则函数为inline。同样,如果存在这样的定义,那么它必须在标题中,除非函数永远不会 odr-used

这些ODR违规是未定义的行为,无需诊断。在实践中,这可能意味着它可能“似乎工作”,或者给出链接错误。

通常情况下,您只使用我希望函数定义出现在标题中的example2情况,但您认为稍后将类定义设置为紧凑且函数体更具可读性。

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

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

答案 1 :(得分:1)

  

默认情况下,类中定义的成员函数是内联的。

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

答案 2 :(得分:0)

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

在您的情况下,函数example2非常简单,关键字inline将起作用。例如,如果优化级别很高,则可以将其编译为内联,但这取决于编译器的行为。如果禁用了优化选项,则它不是内联函数。

在我看来,关键字inline是对编译器的建议,如果函数很复杂,它可能不起作用。