在 C++ 中使用内联说明符的正确方法是什么?

Fur*_*goz 2 c++ methods inline class

我的目标是减少我在class. 这些方法被其他方法使用,并且不打算公开访问。我做了一些研究,但无法整理我发现的信息。inline在定义中而不是在声明中指定方法是否足够?如果该方法可以公开访问,这是一种不好的技术吗?

文件.h

class Foo
{
    /* ... */
public:
    bool bar ( int par );
    void zar ( void );
    /* ... */
};
Run Code Online (Sandbox Code Playgroud)

文件.cpp

inline bool Foo::bar ( int par )
{
    /* ... */
}

void Foo::zar ( void )
{
    /* ... */

    if ( bar(10) )
    {
        /* ... */
    }

    /* ... */
}
Run Code Online (Sandbox Code Playgroud)

在这个例子中使用inline说明符是一个好的技术吗?

该代码可以运行,但我想了解不可预见的后果。这是否是正确的用法。

Qui*_*mby 6

inline官方几乎与该函数是否内联无关。

其官方目的是允许存在多个相同的定义而不违反 ODR(单一定义)规则。这意味着您可以将定义放入标头中,将其包含在多个.cpp文件(翻译单元)中,并且链接器不会抱怨多个定义,而是会选择一个。因此,您必须确保定义相同(即,在单独的.cppinline文件中没有两个具有相同名称的“不相关”函数- 它们应该被标记),否则祝调试调用好运。static

如果你想强制内联,没有标准工具,但所有编译器都支持这样做的指令,例如__attribute__((always_inline))g++/clang。

但是,如果您想依赖编译器来使用其判断,您可以通过确保定义在调用站点可用来帮助它。这可以通过将定义放入标头或启用链接时优化来实现。前者意味着将定义放在类内部或类定义之后的某个位置,在这种情况下标记它们inline。请注意,这意味着实现中的任何更改都需要重新编译包含该标头的所有翻译单元。

在定义中而不是在声明中指定内联方法是否足够?如果该方法可以公开访问,这是一种不好的技术吗?

不能保证,但可以,如果编译器认为内联调用是有益的,它就拥有这样做所需的所有信息。技术不好?我想说这是完全正交的问题,调用者不应该关心“调用约定”。仅仅基于API设计就将方法公开。

在这个例子中使用内联说明符是一个好的技术吗?

不,在单个翻译单元内标记函数内联是没有用的。因为它对其他单位不可见,而对原单位已经可见。我想说,由于我的第二段,这样做甚至是危险的,如果其他人进来并inline Foo:bar在 中实现file2.cpp,链接器将默默地很可能为所有非内联调用选择一个定义,但file.cpp内联内部的调用将调用file::bar定义 - 正如我所说,祝你好运跟踪这些问题。