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

Will inlining a function containing another function cause the inner one to be inlined?

本文关键字:函数 内部函数 是否 包含 另一个      更新时间:2023-10-16

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

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

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

func2是否内联取决于complex如何func2。func1是否内联取决于它在f2展开后的复杂程度(如果有的话)。

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

取决于编译器和环境。

编译器决定内联函数基于:

  1. 代码的可见性。显然,它不能内联编译器没有源代码的函数[1]。
  2. 代码大小。与小函数相比,大函数不太可能内联。
  3. 一个函数被调用的次数。如果它是一个小函数,它可能被调用数百次,仍然是内联的,一个大函数调用不止一次,可能不是内联的。至少GCC有"函数只调用一次"的特殊情况——在这种特殊情况下,它甚至内联了巨大的函数。

因此,在这种情况下,如果func2对编译器可见,并且足够小,编译器认为可以内联,那么它可能会。

绝对没有根据和理由存在这种联系。内联内部函数调用的问题与内联外部函数调用的问题是独立的。

回答你的问题:当然,内部调用被内联的可能性是存在的,但是,它与外部函数是否被内联无关。

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

不,将func1内联将不会自动导致 func2内联;但是总是编译器将内联func2的可能性,无论func1是否内联。

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

有时编译器在没有被问到:编译器什么时候内联c++代码?

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