我的 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
(我使用的是 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