内联函数什么时候不起作用?

时间:2014-05-15 05:10:47

标签: c++ inline

我是一名新手程序员。在我们的教科书中有这些行,sumitha arora class 12 ix edition:

  

内联对以下情况不起作用:

     
      
  1. 对于返回值并具有循环或开关或转到的函数。

  2.   
  3. 对于不返回值的函数,如果存在return语句。

  4.   

如果1和2为真,那么如何创建内联函数?

P.S。从书中没有任何改动的线条完全相同

3 个答案:

答案 0 :(得分:1)

我不知道书中提到的编译器。通常,它将取决于实际的编译器,可以内联的内容或何时生成函数体。

这些陈述并不像你想象的那样相互排斥。 inhehbit inline的一般条件是函数中的一个分支,除了一个简单的if语句。 (1)中的分支是循环和goto。 (2)中的分支是跳转到return;

上函数的末尾

修改

它高度依赖于编译器。嵌套if可能有用。但是switch语句有所不同,因为它们通常使用跳转表而不是几个if语句来实现。跳转表包含类似于goto标签的位置。对于实际的编译器来说,这可能更难。因此,做出区分可能是明智的。

答案 1 :(得分:0)

当代码很小并且堆栈push / pop占用大量开销时,基本上会编写内联函数。他们所做的是,他们扩展了写作的功能。由于没有关联的推/弹,因此您不能期望返回值。虽然,C ++可以将只有return语句的简单函数转换为内联函数。

这是一个C ++代码:

inline int max(int a, int b)
{
  return (a > b) ? a : b;
}

然后,声明如下:

a = max(x, y);

可以转换为更直接的计算:

a = (x > y) ? x : y;

答案 2 :(得分:0)

恕我直言,C ++标准没有定义内联的限制。内联函数在7.1.2.2节中定义:

  

带有内联说明符的函数声明声明了内联   功能。内联说明符指示实现   在呼叫点处对函数体进行内联替换   优于通常的函数调用机制。一个实现是   不需要在通话点执行此内联替换;

编译器通常会有一些启发式方法来决定是否内联函数。这平衡了执行实际函数调用(在堆栈上推送参数,跳转等)的成本与具有更大函数的效果(最明显的缺点是生成的二进制文件的大小增加),但具体规则保持开放对于编译器实现者。

如果本书没有讨论特定的编译器,我看不出为什么这个陈述一般是正确的。不过,这可能是一个经验法则。