内联在C++和编译器中

jer*_*tus 3 c++ compiler-construction inline

!特定于常用的方法,如getter和setter.!

我不知道何时inline应该使用关键字.我知道它的作用,但我仍然不知道.

根据Bjarne Stroustrup的采访,他说:

我自己的经验法则是使用内联(显式或隐式)仅用于我知道经常使用的简单的单行或双行函数,并且多年来不太可能发生太大变化.就像vector的size()函数一样.内联的最佳用途是函数,其中body的代码少于函数调用和返回机制,因此内联函数不仅比非内联版本更快,而且在对象内核中更紧凑:更小更快.

但是我经常读到编译器会自动内联短函数,比如getter,setter方法(在这种情况下得到的size()是a vector).

有人可以帮忙吗?

编辑:

多年来回到这一点并且更多地体验高性能C++ +编程,内联确实可以提供帮助.在游戏行业工作甚至强制在线有时会有所作为,因为并非所有编译器都能正常工作.有些可能会自动内联,有些则不会.我的建议是,如果您使用框架,库或任何使用频繁的代码考虑使用内联,但这只是一般建议,因为您希望这些代码完全针对任何编译器进行优化.始终使用内联可能不是最好的,因为您还需要这部分代码的类定义.如果您不能再使用前向声明,有时这会增加编译时间.

另一个提示:即使分离了函数定义,你也可以使用C++ 14自动返回类型推导:

MyClass.h

class MyClass
{
    int myint;
public:
    auto GetInt() const;
}  

inline auto MyClass::GetInt() const { return myint; }
Run Code Online (Sandbox Code Playgroud)

所有在.h文件中.

Xar*_*arn 5

实际上,inline关键字不再适用于编译器,而是适用于链接器.

也就是说,虽然inline在函数声明中仍然可以作为一个提示用于大多数编译器,但在高优化设置中,如果他们认为对于生成的代码更好,那么它们inline将在没有内联的情况下内联,也不会内联inline.

仍然需要将函数符号标记为弱函数,从而绕过一个定义规则,该规则说明在要生成二进制文件的给定目标文件集中,每个符号(如函数)只能出现一次.