如果我们定义的一件功能的类定义本身就是它一定是处理内联或者是它只是一个请求编译器,它可以忽略。

有帮助吗?

解决方案

是,被在类体中定义的函数是隐含inline

(与其它函数声明inline这并不意味着该编译具有其中函数被调用来执行的地方内联展开,它只是使所允许的“一个定义规则”的松弛,结合的要求,即的定义必须包括在其中所使用的函数的所有翻译单元。)

其他提示

正如其他人指出,在类中定义的方法会自动直列请求。 这是非常有用的理解。

假设它不是。你必须产生这样一个功能码,并且处处它被调用,跳转到子程序指令将不得不引用的位置,经由所述连接体。

class A {
public:
  void f() { ... your code ... }
};

每到这个代码被视为时间,如果它不是内联,编译器只能假设它必须被生成的,所以这将产生的符号。假设它是这样的:

A__f_v:

如果该符号是全球性的,那么如果发生在不同的模块多次包括这个类代码,就必须在链接时乘法定义的符号错误。因此,它不可能是全球性的。相反,它的文件本地。

假设你包括在多个模块的上述头文件。在每一个,它会生成代码的本地副本。这比完全不汇编更好,但你得到的代码的多个副本,当你真正需要的只有一个。

这导致了以下的结论:如果你的编译器不会内联函数,你是显著更好宣告一次的地方,而不是要求它内联

不幸的是,是什么,是不是内联是不可移植。它是由编译器作者定义。一个好的经验法则是永远让每一个衬垫,特别是其本身只是调用一个函数,内联,当你删除开销的所有功能。下面三行线性码什么是几乎可以肯定是好的。但是,如果你在代码回路,问题是编译器是否会允许它内联,以及更重要的是,你会怎么多少好处,即使它没有你想要什么看。

考虑这个内联代码:

inline int add(int a, int b) { return a + b; }

这不仅几乎一样小的原型将是在源代码中,而是由内联代码生成的汇编语言小于调用一个例程会。因此,此代码更小,更快。

而且,如果你恰巧被路过的常量:

int c= add(5,4);

它在编译时解析并没有代码。

在gcc的,我最近注意到,即使我没有内嵌代码,如果是本地的文件,他们会悄悄直列也无妨。如果我单独的源模块,他们并不优化掉该呼叫在声明函数,这只是。

在光谱的另一端,假设你上的1000行的代码段内联请求。即使你的编译器是愚蠢的,足以与它一起去,你保存的唯一的事情就是调用本身,而代价是每次调用时,编译器必须粘贴所有的代码,如果你调用代码n次,你的代码由生长在常规* N的大小。因此,任何超过10行大是非常不值得的内联,除了特殊情况下它只能被称为一个非常小的次数。这方面的一个例子可能是在由仅2个其他被称为私有方法。

如果您请求内联含有循环的方法,它才有意义,如果经常执行少数倍。但考虑循环它迭代一百万次。即使代码是内联,时间在调用中花费的比例是很小的。所以,如果你有在它的循环,这往往是更大反正方法,这些都是值得的头文件中删除,因为他们一)往往会被拒绝由编译器和b内联),即使它们被内联,一般不会提供任何益处

它必须处理由编译器作为要求为内联--它可以忽略。有一些惯用语定义的某些功能的标题(例如空虚拟析构)和一些必要的标题定义(模板功能),但除此之外看看 GotW#33 更多的信息。

一些已注意到,编译器,甚至可能内联的功能,你永远不会要求它,但是我不确定是否会失败的目的请求联的功能。

它确实是内联的 - 但任何内嵌请求可以被编译器忽略

这是编译器的请求,它可以忽略不计。

2003年ISO C++标准说

7.1.2/2功能宣言》(8.3.5,9.3,11.4)与内联 说明符,声明的内联 功能。内联符 指示的执行情况, 内联替代的功能 身体在点的呼叫 优选的通常的功能呼叫
机构。一个实现不是 要求执行这个内联
取代点的话;然而,即使如果这个内联
替代被省略了,其他的 规则内的功能定义 通过7.1.2仍应得到尊重。

7.1.2/3的一个功能的定义内一类的定义是一个内联
功能。内联符的应 不会出现在一块范围的功能 《宣言》。

7.1.2/4内联的功能应规定在每个翻译单位
它是用,并应有 完全相同的定义在每一个
情况(3.2).[注:一个呼叫 内联的功能可能会遇到的
在其定义中出现的 翻译单元。]如果一个功能 与外部的联系是宣布 内联在一个翻译单位,它的 应宣布在内联的所有 翻译单位在其它 出现;没有诊断是必需的。一个 内联的功能,与外部 联系应具有相同的地址在 所有翻译单位。一个静态的 当地变量在外部内联
功能始终指的是一样的 对象。一个字符串中的一个
外部内联的功能是一样的 目在不同的翻译
单元。

有两件事情,不应该集中一起:

  1. 你怎么标记一个功能正在内联:定义,它与联在前面签名或将它定义在宣言点;
  2. 什么编译器将对这些内联的标记:无论如何你标志的功能的内联它将被视为一种请求,通过编译器。
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top