C++ 在C+中内联+;编译程序

C++ 在C+中内联+;编译程序,c++,compiler-construction,inline,C++,Compiler Construction,Inline,!!特定于经常使用的方法,如getter和setter 我不知道什么时候应该使用关键字inline。我知道它是干什么的,但我还是不知道 根据对比亚恩·斯特劳斯图普的采访,他说: 我自己的经验法则是只对简单的单线或双线函数使用内联(显式或隐式),我知道这些函数经常使用,而且多年来不会有太大变化。比如向量的size()函数。内联的最佳用途是用于函数体代码少于函数调用和返回机制的函数,因此内联函数不仅比非内联版本快,而且在对象核心中更紧凑:更小更快 但我经常读到编译器自动内联短函数,如getter、s

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

我不知道什么时候应该使用关键字
inline
。我知道它是干什么的,但我还是不知道

根据对比亚恩·斯特劳斯图普的采访,他说:

我自己的经验法则是只对简单的单线或双线函数使用内联(显式或隐式),我知道这些函数经常使用,而且多年来不会有太大变化。比如向量的size()函数。内联的最佳用途是用于函数体代码少于函数调用和返回机制的函数,因此内联函数不仅比非内联版本快,而且在对象核心中更紧凑:更小更快

但我经常读到编译器自动内联短函数,如getter、setter方法(在本例中,获取
向量的
size()

有人能帮忙吗

编辑:

在经历了多年的高性能C++编程经验之后,回到这里,内联确实有帮助。在游戏行业工作有时甚至forceinline也会有所不同,因为并非所有的编译器都工作相同。有些可能会自动内联,有些则不会。 我的建议是,如果您在框架、库或任何大量使用的代码上工作,请考虑使用内联,但这只是一般的建议,因为您希望这样的代码对于任何编译器都是完全优化的。始终使用内联可能不是最好的,因为这部分代码还需要类定义。如果不能再使用前向声明,有时这会增加编译时间

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

MyClass.h

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

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

所有文件都集成在一个.h文件中。

Bjarne的引用很旧。现代编译器在这方面相当聪明

也就是说,如果不使用链接时代码生成,编译器必须查看代码以内联它。对于多个.cpp文件中使用的函数,这意味着您需要在标题中定义它们。在这种情况下,为了避免使用单定义规则,必须将这些函数定义为
inline


默认情况下,类中定义的类成员是
inline

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

也就是说,虽然函数声明中的
inline
仍然可以作为大多数编译器的提示,但在高优化设置下,如果编译器认为对生成的代码更好,他们将不使用
inline
内联,也不使用
inline
内联


仍然有必要将函数符号标记为弱符号,从而绕过一个定义规则,即在给定的一组目标文件中,要将其转换为二进制,每个符号(如函数)只能出现一次

以下内容专门针对C++:

inline
关键字与内联无关

inline
关键字允许在同一程序中多次定义同一函数:

每个程序应仅包含该程序中使用的每个非内联函数或变量的一个定义;无需诊断

§3.2[基本定义odr]

内联
关键字中附加超出此范围的含义是错误的。编译器可以根据“仿佛规则”自由内联(或不内联)任何内容:

执行格式良好的程序的一致性实现应产生与具有相同程序和相同输入的抽象机器对应实例的可能执行之一相同的可观察行为

§1.9[执行简介]


考虑到编译器优化可以做什么,我今天唯一使用的内联函数是用于非模板函数,其主体在类主体之外的头文件中定义

默认情况下,类主体内的所有内容都是内联的(注意:defined!=declared),就像模板一样

实际上,
inline
的意思是:“在头中定义,可能在多个源中导入,只保留一个副本”告诉链接器


可能在c++35中,最终会有人决定用另一个更有意义的关键字替换该关键字。

c++标准第7.1.2节第2点:

(…)内联说明符向实现指示 函数体在调用点的内联替换是 与通常的函数调用机制相比,首选。实施 不需要在指定点执行此内联替换 调用(…)

换句话说,编译器可能只是在调用函数的不同位置复制代码,而不是为函数编写一个代码(多次调用)。这避免了与函数调用相关的小开销,但代价是更大的可执行文件

请注意,
inline
关键字也可以与名称空间一起使用,但含义截然不同。内联命名空间的成员在大多数方面都可以像封闭命名空间的成员一样使用。(见标准第7.3.1节第8点)

编辑:
建议仅当函数为十行或更少时才内联

我自己在回答这个问题!:解决方案:经过几次性能测试,Stroustrup的经验法则是正确的!从vector内联.size()等短函数可以提高性能(经常使用(.size()调用)。但这种影响只在频繁使用的函数中明显。如果经常使用getter/setter方法,将其内联可能会提高性能

Stroustrup:

未经事先确认,不要声明代码的“效率”
时间测量。猜测