0

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

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

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

4

5 回答 5

2

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

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

于 2013-06-04T14:00:39.257 回答
1

取决于编译器和情况。

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

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

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

于 2013-06-04T14:01:19.453 回答
1

这种联系的存在绝对没有根据,也没有理由。内联内部函数调用的问题独立于内联封闭函数调用的问题。

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

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

于 2013-06-04T13:59:17.353 回答
0

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

有时编译器在没有被问到时会这样做:编译器何时内联 C++ 代码?

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

于 2013-06-04T14:00:33.977 回答
0

不,func1内联不会自动导致 func2内联;但是编译器总是有可能会 inline func2,与是否func1inline 无关。

于 2013-06-04T13:59:45.093 回答