【30】透彻了解inlining 的里里外外

1、inline方法相当于文本替换,不需要承担方法调用的额外开销,同时还有潜在的优势,文本替换后,编译器会进行代码优化。而对于方法调用,编译器没有能力进行代码优化。

2、显而易见,inline方法往往会导致目标代码膨胀变大。但是,对于方法本体很小的情况,可能会出现,替换后的文本比方法调用的代码还要小。这也意味着,一般情况下,只有方法本体比较小的情况,才应该声明为inline。

3、特别注意:inline只是一个申请,而不是命令。同时,对于class定义中的方法实现,也暗示着申请inline。申请inline告诉编译器,进行文本替换,但最终能不能文本替换,还要取决于编译器。

4、编译器拒绝对业务复杂(包含循环和递归)的方法inlining,同时拒绝对virtual方法执行inlining,为啥?

  virtual方法是运行时确定调用哪个方法,而inline是编译时文本替换,二者矛盾。

5、当取inline方法地址的时候,也不进行文本替换,为啥?

  这种情况是取地址,进行文本替换没有意义。

6、构造方法和析构方法不应该是inline,为啥?

  C++对于“对象被创建和被销毁时发生什么事”做个保证。比如:构造过程出现异常,C++保证构造好的那一部分自动销毁。这就意味着,为了满足这种保证,C++在构造方法中,增加了一些代码。如果将构造方法声明为inline,意味着文本替换,这就妨碍编译器添加一些代码。

7、考虑下面的情况,其他程序集使用一个方法,这个方法做了修改。如果这个方法是inline,意味着外部程序集必须重新编译,重新进行文本替换。而如果不是inline,外部程序集不需要重新编译。

8、显然,inline方法不能很好地支持调试。有些调试器勉强支持调试,为了支持调试inline,大多数调试器的做法是:在调试版本禁止inlining。

9、正确的做法是:一开始不要声明为inline,在后期找到效率的瓶颈所在,如果是方法调用导致的原因,再进行inline。

原文地址:https://www.cnblogs.com/nzbbody/p/3528825.html