我是一名新手程序员。在我们的教科书中有这些行,sumitha arora class 12 ix edition:
内联对以下情况不起作用:
对于返回值并具有循环或开关或转到的函数。
- 醇>
对于不返回值的函数,如果存在return语句。
如果1和2为真,那么如何创建内联函数?
P.S。从书中没有任何改动的线条完全相同
答案 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节中定义:
带有内联说明符的函数声明声明了内联 功能。内联说明符指示实现 在呼叫点处对函数体进行内联替换 优于通常的函数调用机制。一个实现是 不需要在通话点执行此内联替换;
编译器通常会有一些启发式方法来决定是否内联函数。这平衡了执行实际函数调用(在堆栈上推送参数,跳转等)的成本与具有更大函数的效果(最明显的缺点是生成的二进制文件的大小增加),但具体规则保持开放对于编译器实现者。
如果本书没有讨论特定的编译器,我看不出为什么这个陈述一般是正确的。不过,这可能是一个经验法则。