2

In a text book I read inline functions cant contain recursion, go to, loops etc. Why? I dont think it will produce a syntax error if I do so.

4

5 回答 5

3

你的课本错了。

inline首先,重要的是要了解“将函数声明为”和实际的“函数调用内联”的概念之间的区别。前者适用于函数本身,而后者独立地适用于每个调用。

现在,内联函数可以包含任何东西。几乎所有对任何函数的直接调用都可以内联。没有任何限制。

包含循环或本地 goto 的内联代码显然没有问题。因此,当您的书中说内联函数“不能包含循环或 goto”时,它一定是指某些特定(并且可能非常古老)编译器的怪癖,由于某些特定于实现的原因,它无法内联此类函数。

递归是一个不同的故事。显然,如果在编译时不知道递归的深度,就不可能完全内联所有嵌套的递归调用。然而,仍然可以将递归“解包”到特定的有限深度。即,编译器可以内联递归调用,比如 5 级深度,然后进行真正的(非内联)递归调用。这与称为“循环展开”的优化技术没有太大区别。因此,即使是递归函数也可以内联。一些编译器甚至可以让您控制递归函数的内联扩展深度。

于 2013-06-04T17:55:24.610 回答
2

此代码完全有效:

class Test 
{
  public:
    inline void sayHello(int i);
};

void Test::sayHello(int i)
{
  std::cout << "Hello "<< i << std::endl;
  if (i>0)
    sayHello(i-1);
}

int main(int argc, char** argv) {
    Test t;
    t.sayHello(10);
}

..并按预期递归。

(GCC 4.6.3)

在这种情况下,函数没有内联,因为内联只是对编译器的提示。不是要求。

作为上述评论中的建议者,您将在这里找到更完整的答案: 递归函数可以内联吗?

于 2013-06-04T15:44:29.407 回答
2

这听起来像是内联函数的 C++ 概念与内联扩展函数调用的优化之间的混淆。

内联函数是在每个使用它的翻译单元中定义的函数;与非内联函数不同,非内联函数必须根据单一定义规则仅在一个翻译单元中定义。这些函数可以做什么没有特别的限制;特别是,他们可以像你说的那样递归地调用自己。

内联函数和优化之间的联系是许多编译器在编译调用站点时需要定义可用;这通常要求函数是内联的,以便在多个翻译单元中具有定义。

这本书的意思可能是说递归调用不能内联扩展,因为这意味着生成的代码必须包含自身的副本;那是不可能的。但是仍然没有理由不包含循环、分支或任何其他正常的流控制语句。

于 2013-06-04T15:59:19.217 回答
1

As Mike said, the language definition has no such restrictions on inline functions. What you sometimes see is a compiler warning that a function wasn't expanded inline because it used some language construct that the compiler won't inline, such as recursion, loops, etc. That's only telling you that the function wasn't expanded inline, so you didn't get an optimization that you might have wanted. The code is valid and the resulting executable will work correctly.

于 2013-06-04T17:40:27.400 回答
0

我们可以在内联函数中使用循环、递归等。但是为了良好的编程习惯,我们不这样做;因为对于循环中编写的指令的每一次执行,我都必须由您的 CPU 管理。它可能会占用您内存中的一些额外空间。

于 2014-01-17T22:55:51.633 回答