C++中内联函数何时被编译器禁止?

C++当中定义内联函数,可以让编译器将对内联函数的调用直接展开。


这就多少有点像宏定义了,而且没有宏定义的缺点(预处理替换,无法当成变量链接到符号表、调用有可能导致参数异常被改、等等)。


使用内联函数可以避免函数调用的开销(栈开辟、返回地址设定、栈展开),在一定的程度上可以提高程序的性能。但是这种提高是有代价的。

编译器将函数展开,会直接导致可执行程序变大。(导致运行缺页、cache命中率降低 effective c++ page 135)


编译器在某些情况下会禁止inline:


1:编译器禁止虚函数inline


      inline展开是在编译时进行的(宏定义是在预处理时展开的),而虚函数是在运行时决定调用哪个函数的。因此编译器对虚函数的inline无能为力

     (g++下试验过,编译器连警告都没有一个)


2:带有循环或者递归的调用

    

      如何inline函数过于复杂,复杂到函数本身执行的成本,比函数调用(栈开销)成本还要高,编译器禁止inline


3: 通过函数指针调用inline函数


      虽然编译器会展开inline函数,但是还是会为内联函数生成函数本体。通过函数指针,使得其等于内联函数,通过函数指针调用,无法 inline


     inline void f() {...}

    void (*p)()=f;

     p();   //此处无法内联

    

   

你可能感兴趣的:(C++)