假设我们有一个调用自由函数的类成员函数:
class MyClass
{
public:
void func1() {func2();}
};
我很想知道编译器是否有可能func2
因为内联而将 ()内的函数内func1
联?
事实func2
是否内联取决于func2的复杂程度。func1 是否内联的事实取决于 f2 扩展(如果有)之后的复杂程度。
内联本质上是一种编译器优化,它不依赖于函数定义是否内联源(因此可重复)这一事实。
取决于编译器和情况。
编译器决定内联函数基于:
因此,在这种情况下,如果func2
对编译器可见,并且足够小以至于编译器认为可以内联,那么它可能会。
这种联系的存在绝对没有根据,也没有理由。内联内部函数调用的问题独立于内联封闭函数调用的问题。
解决您的问题:当然,内部调用将被内联的可能性是存在的,但同样,它与外部函数是否被内联无关。
应该注意的是,编译器决定是否内联函数的决策算法通常足够聪明,以避免过度的代码膨胀,即避免生成过长的函数。这意味着在某些情况下,内联外部函数可能意味着内部调用不会被内联。反之亦然。
内联行为完全由实现定义。编译器可以自由地忽略或尊重或使用自己的启发式方法来确定应该做什么。
有时编译器在没有被问到时会这样做:编译器何时内联 C++ 代码?
有时编译器会忽略它:https ://softwareengineering.stackexchange.com/questions/35432/inline-functions-in-c-whats-the-point
不,func1
内联不会自动导致 func2
内联;但是编译器总是有可能会 inline func2
,与是否func1
inline 无关。