zoukankan      html  css  js  c++  java
  • 【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。

  • 相关阅读:
    单臂路由
    C#同步、异步编程
    Grid控件
    使用WrapPanel和DockPanel
    使用StackPanel进行简单地布局
    WPF布局
    SQL update 多表连接方法
    创建一个自定义的Application类
    Application全局应用程序类
    XAMl使用其他命名空间中的类型及加载和编译
  • 原文地址:https://www.cnblogs.com/nzbbody/p/3528825.html
Copyright © 2011-2022 走看看