内联包含另一个函数的函数会导致内部函数被内联吗?

时间:2013-06-04 13:56:01

标签: c++ function inline

假设我们有一个调用自由函数的类成员函数:

class MyClass
{
public:
  void func1() {func2();}
};

我很想知道编译器是否有可能内联函数(func2),因为func1是内联的?

5 个答案:

答案 0 :(得分:2)

事实func2是否内联取决于复杂是如何func2。 func1内联与否的事实取决于f2扩展后的复杂程度(如果有的话)。

内联本质上是一种编译器优化,它不依赖于函数定义是内联的(因此是可重复的)的事实。

答案 1 :(得分:1)

绝对没有基础,没有理由存在这种联系。内联函数调用的内联问题与内联函数调用的内容无关。

解决你的问题:当然,内部调用将被内联的可能性,但同样,它与外部函数是否内联无关。

应该注意的是,决定是否内联函数的编译器决策算法通常足够智能以避免过多的代码膨胀,即避免产生极长的函数。这意味着在某些情况下内联函数可能意味着内部调用将内联。反之亦然。

答案 2 :(得分:1)

取决于编译器和情况。

编译器根据以下内容决定内联函数:

  1. 代码的可见性。显然,它无法内联编译器没有[1]源代码的函数。
  2. 代码的大小。与小函数相比,大函数不太可能被内联。
  3. 对函数的调用次数。如果它是一个小函数,它可能被调用数百次并且仍然被内联,一个不止一次调用的大函数可能没有内联。至少GCC有一个特殊情况,即“只调用一次函数” - 它在这种特殊情况下甚至可以概括出巨大的功能。
  4. 因此,在这种情况下,如果func2对于编译器是可见的,并且足够小以至于编译器认为可以内联,那么它可能就是。

答案 3 :(得分:0)

不,内联func1不会自动导致 func2内联;但总是编译器可能会内联func2,而不管func1是否内联。

答案 4 :(得分:0)

内联行为是完全实现定义的。编译器可以自由地忽略或尊重或使用自己的启发式方法来确定应该做什么。

有时编译器会在没有询问时执行此操作:When do compilers inline C++ code?

有时编译器会忽略它:https://softwareengineering.stackexchange.com/questions/35432/inline-functions-in-c-whats-the-point