内联在C和编译器中

!特定于常用的方法,如getter&二传手. !

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

根据Bjarne Stroustrup的采访,他说:

My own rule of thumb is to use inlining (explicitly or implicitly) only for simple one- or two-line functions that I know to be frequently used and unlikely to change much over the years. Things like the size() function for a vector. The best uses of inlining is for function where the body is less code than the function call and return mechanism, so that the inlined function is not only faster than a non-inlined version, but also more compact in the object core: smaller and faster.

但我经常读到编译器自动内联短函数,如getter,setter方法(在这种情况下获取向量的size()).

有人可以帮忙吗?

编辑:

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

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

MyClass.h

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

inline auto MyClass::GetInt() const { return myint; }

所有在.h文件中.

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

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

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

转载注明原文:内联在C和编译器中 - 代码日志