Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我的C++;内联方法是否可以显式声明为内联? (我使用GNU+V5.2.1和C++ 11,但这是一个通用的C++问题)_C++_C++11_Inline - Fatal编程技术网

我的C++;内联方法是否可以显式声明为内联? (我使用GNU+V5.2.1和C++ 11,但这是一个通用的C++问题)

我的C++;内联方法是否可以显式声明为内联? (我使用GNU+V5.2.1和C++ 11,但这是一个通用的C++问题),c++,c++11,inline,C++,C++11,Inline,我想在我的.hpp文件中放一些简单的方法。我的项目中的许多.cpp文件包括以下.hpp文件: class foo { public: int example1( int i ) { return i + 5; } inline int example2( int i ) { return i + 5; } }; 当一个显式声明为inline而另一个未提及inline时,example1()和example2()之间是否有区别 我应该选择一

我想在我的.hpp文件中放一些简单的方法。我的项目中的许多.cpp文件包括以下.hpp文件:

class foo
{
    public:

        int        example1( int i ) { return i + 5; }
        inline int example2( int i ) { return i + 5; }
};
当一个显式声明为
inline
而另一个未提及
inline
时,
example1()
example2()
之间是否有区别

我应该选择一个而不是另一个吗



编辑:不,HostileFork,你把另一个问题标记为一个可能的副本,但我没有回答我的问题。

< P>我认为这取决于C++编译器的选择。如果优化级别很高,一些小函数将作为内联函数进行优化

在您的例子中,函数example2很小也很简单,关键字inline可以工作。例如,1,如果优化级别较高,则可以将其编译为内联,但这取决于编译器的行为。如果禁用“优化”选项,它将不是内联函数


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

< P>我认为这取决于C++编译器的选择。如果优化级别很高,一些小函数将作为内联函数进行优化

在您的例子中,函数example2很小也很简单,关键字inline可以工作。例如,1,如果优化级别较高,则可以将其编译为内联,但这取决于编译器的行为。如果禁用“优化”选项,它将不是内联函数


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

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

但是,如果车身不符合要求,则情况有所不同:

class foo
{
    public:
        int example1( int i );
        inline int example2( int i );
};
在这段代码中,
foo::example2
是一个内联函数。行外定义也必须出现在标题中(除非函数从未使用odr)。脱机定义是否还包括
内联
说明符是可选的

对于
foo::example1
,如果存在带有
inline
说明符的越界定义,则函数为
inline
。同样,如果存在这样的定义,那么它必须在头中,除非函数从未使用过odr

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


通常,您只会使用my
example2
案例,其中您希望函数定义出现在标题中,但您认为以后压缩类定义和函数体更具可读性

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


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

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

但是,如果车身不符合要求,则情况有所不同:

class foo
{
    public:
        int example1( int i );
        inline int example2( int i );
};
在这段代码中,
foo::example2
是一个内联函数。行外定义也必须出现在标题中(除非函数从未使用odr)。脱机定义是否还包括
内联
说明符是可选的

对于
foo::example1
,如果存在带有
inline
说明符的越界定义,则函数为
inline
。同样,如果存在这样的定义,那么它必须在头中,除非函数从未使用过odr

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


通常,您只会使用my
example2
案例,其中您希望函数定义出现在标题中,但您认为以后压缩类定义和函数体更具可读性

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

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

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

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


这些可能的副本是相同的。如果类成员函数的定义出现在标题中,则类成员函数将自动内联。如果要在头文件而不是源文件(.cpp)中定义非成员函数,只需将其标记为
inline
,编译器就有机会优化调用。@HostileFork那里的答案似乎只涉及非成员函数functions@St埃芬尼,我不知道你的问题哪一部分没有得到回答。在询问之前,您可能知道不需要添加内联来获取内联的语义(例如,在没有内联标记的标题中,您不会从多个包含方法定义的类中获得链接器错误)。因此,除此之外,您还要询问编译器是否出于任何优化原因关注内联。答案是:除了语义方面,现在大多数编译器都抛弃了内联。它们可能是相同的。班级成员