同时它将会非常方便地使用内联职能在某些情况下,

是否有任何缺点的内联职能?

结论:

显然,没有什么错误使用内联的职能。

但值得注意的是以下几点!

  • 过度使用内联可能实际上使程序较为缓慢。根据一个函数的大小、内联它可以引起码尺寸增加或减少。内联是一个非常小的访问功能通常会减少代码尺寸的话,内联是一个非常大的功能,可以大大增加码的大小。在现代的处理较小的代码常运行得更快,由于更好的使用的指令缓存。 -谷歌准则

  • 速度好处的内联的职能往往会削弱作为功能的增长的尺寸。在某一点的开销功能的电话变得比较小的执行功能的身体和好处是失去了 -源

  • 有些情况下,一个内联的功能可能不工作:

    • 用一个功能返回值;如果返回声明的存在。
    • 用一个功能没有返回的任何价值观;如果一个循环,换或转到的声明是否存在。
    • 如果一个功能是递归的。 -源
  • __inline 关键字引起一个功能将内联只有如果你指定的优化选择。如果优化被指定,不论是否 __inline 荣获取决于设置的线优化选择。默认情况下,联的选择是有效的,只要的优化运行。如果你指定的优化,还必须指定noinline的选择,如果你想要的 __inline 关键字被忽略。 -源

有帮助吗?

解决方案

它值得指出的是,内的关键字是实际上只是一个提示来编译器。编译器可能忽略的内联和简单的产生的代码功能的地方。

主要缺点的内联职能的是,它可以 增加的大小可执行 (根据一些实例).这可能是一个问题上的一些平台(例如。嵌入式系统),特别是如果能本身就是递归的。

我还建议使联会的功能 非常小 -的速度好处的内联的职能往往会削弱作为功能的增长的尺寸。在某一点的开销功能的电话变得比较小的执行功能的身体和好处是丧失。

其他提示

它可能增加的大小 可执行的,而且我不认为 编译器将总是实际上使 它们的内联即使你用的 内联的关键词。(或者是其它 周围的方法,像什么 崴巴吾 说的了吗...)

我认为这是通常确定如果 功能只有1或2发言。

编辑: 这里就是linux CodingStyle 文件说:

第15章:内联疾病

似乎有一个共同的 错误观念,海湾合作委员会有一个魔术 "让我更快"加速选择 "内联".同时使用内联可以 须适当(例如作为一种手段 替代的宏见第一章12), 它常常是没有的。大量使用 内联的关键字导致了很多 更大的内核,这又减慢 作为一个整体系统下,由于一个 大icache占用的CPU 而只是因为那里是不 存储器可用于页缓存.只是想想看一页缓存小姐 导致一盘求,这容易需要 5毫秒.有很多的cpu 循环,可以进入这些5 毫秒.

合理的经验法则是不 把内联的职能有更多 于3行的代码。一个 此规则的例外的情况下 其中一个参数被称为是一个 compiletime定,作为一个结果 这constantness你 知道吗 的 编译器,将能够最优化 你能走在编译时间。对于一个很好的例子以后这种情况下, 看到kmalloc()联的功能。

人们常常争辩说,增加内联 要职能是静态的和使用 只有一次,总是一个赢得自那里 是没有空间的权衡。虽然这是 技术上是正确的,海湾合作委员会是能够 内联些情况下自动 帮助和维持的问题 除去联时的第二个户 出现超过了潜在的价值 提示告诉海湾合作委员会做到的 东西它都会这么做无论如何。

我同意其他员额:

  • 内联可能是多余的,因为编译器会做的
  • 内联可能会膨胀你的代码

第三点是,它可能迫使你获得实施细节在你的头.e.g.,

class OtherObject;

class Object {
public:
    void someFunc(OtherObject& otherObj) {
        otherObj.doIt(); // Yikes requires OtherObj declaration!
    }
};

没有内联一向宣言》的OtherObject是所有你需要的。与联你 头需要的定义OtherObject.

正如其他人已经提到的,行内的关键字只是一个提示来编译器。事实上,大多数现代化将编译器完全忽略这种暗示。编译器有其自己的启发,决定是否行内一个功能,而且相当坦率地说不想要你的建议,非常感谢你。

如果你真的,真的想要使一些内联的,如果你实际上已经分析它并期待在拆卸,以确保压倒一切的编译器启发式的实际意义,那么这是可能的:

  • 在VC++,使用__forceinline的关键字
  • 在海湾合作委员会,使用__属性__((always_inline))

内联的关键词不会有第二次,有效的目的而宣布的功能,在标题的文件,但不是内部一类的定义。内联的关键词是需要告诉编译器而不产生多种定义的功能。

还有一个问题与联-一旦你限定的一个功能在一个标题的文件(这意味着内联,无论是明确或隐含的限定一个机构的成员数类),没有简单的方法来改变它没有强迫您的用户要重新编译(而不是重新链接).这往往会导致问题,特别是如果能在问题是定义中的一个图书馆和标题是其一部分的界面。

我怀疑。甚至编译器自动内联的某些功能的优化。

我不知道如果我的答案是相关的问题,但是:

非常 小心有关联的虚拟方法!一些车编(以前版本的视觉C++例如)将产生联的代码,用于虚拟方法标准的行为是什么也不做,但下去继承树并呼吁适当的方法。

内联大的职能可以使程序较大,导致更多的高速缓存缺失,并使得较慢。

决定何时一个功能是足够小的内联将会增加表现是相当棘手。 谷歌的C++Style指南 建议只有内联职能的10线以下。

你也应该注意到,内的关键字是只有一个请求。编译器可以选择不行内,同样的编译器的可能选择做一个功能的内联你没有定义为"内联"如果它认为速度/大小的代价是值得的。

这一决定是一般的基础上提出的一些事情,如设定之间的优化速度(可以避免的功能呼叫)和优化用于大小(内联可能会导致代码膨胀,因此不大于大型的多次用功能)。

与VC++编译可以在此改变这一决定通过使用 __forceinline

因此,在一般情况:使用内联如果你真的希望有一个功能在一个标题,但在其他地方看一点点因为如果你要获得任何东西,一个很好的编译器将被使其内联你无论如何。

过内联的职能可以增加小的编译可执行的,它可有负面影响的缓的性能,但是现在决定编译器有关的功能的内联他们自己的(取决于许多标准)和忽视线内的关键字。

除其他问题与联的职能,这我已经看到大量使用过度(我看过内联职能的500线),什么你必须要知道的是:

  • 构建的不稳定性

    • 改变源码的一个内联的功能使所有用户的标题重新编译
    • #includes漏入的客户。这可能是非常讨厌如果返工的一个内联的功能和删除一个不再使用的标题,一些客户已依赖。
  • 可执行的大小

    • 每次一个内联是内联的,而不是一个呼叫指令编译器生成的整个码的内联。这是确定的,如果代码的功能是短期(一个或两个线的),不太好,如果功能是漫长的
    • 一些职能可以产生更多的代码比在第一次出现。我点是一个微不足道'析构一级,有很多非pod件的变量(或两个或3个成员变量,而不是杂乱析构).一个呼叫必须产生于 析构函数。
  • 执行时间

    • 这是非常依赖于你的CPU缓存和共享图书馆,但当地的基准是重要的。如果你可能会发生内联将举行的cpu缓存在一个地方,一些客户可以找到代码一个不遭受一个缓错过和随后取存储器(和更糟糕的是,它应该发生,磁盘fetch).可悲的是这是这些情况下,你真的需要做的绩效分析。

本编码标准,我的工作限制的内联的功能以简单的制定者/吸气,并具体说析构不应该内联的,除非你有性能的测量显示的内联赋予一个明显的优势。

  1. 正如其他人所说,内联的功能可以创建一个问题,如果代码是很大的。为每一条指令是存储在一个特定的存储位置,所以重载的内联的功能作一个代码需要更多的时间来获得exicuted.

  2. 还有一些其他的情况的内联可能不起作用

    1. 不工作的情况下递归功能。
    2. 它也可能不起作用静态变量。
    3. 它也不工作的情况下,有的是使用一个循环,交换机等。或者我们可以说,与多个发言。
    4. 和功能,主要不能作为内联的功能。
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top