zoukankan      html  css  js  c++  java
  • Effective C++ 深入理解inline

    Effective C++ 深入理解inline

    inline语义

    inline本义是将所调用函数用自身的函数本体替换之,免受函数调用所招致的额外开销,比宏还要不易出错;但是实际上inline的受编译器的控制,编译器根据执行语境来对inline函数是否做优化,inline只是对编译器的申请,不是强制命令。

    inline各种情况

    1,如果函数体比较大,用inline关键字可能导致编译产生的目标文件过大,导致额外的换页行为,降低CPU高速缓存的命中率,效率有损失;当然如果inline函数本体很小,还可能导致更小的目标文件和更高的CPU SRAM的命中率。 
    2,有些简单的成员函数或friend函数,可能编译器会主动进行inline优化,隐式的inline

    class Person {
    public:
        int height() const { return p_height; }
    private:
        int p_height;
    }

    3,template inline的组合通常定义在头文件中,因为大多数的build环境在编译的过程中进行inlining,为了将函数调用替换为函数体,编译器必须知道函数长什么样子。少量特殊情况会在link或runtime(托管环境下的C#)阶段替换,如果在写template时,没有必要将某个函数进行inline,就避免吧。 
    4,大部分编译器拒绝将太过复杂的函数inlining,而且对带有virtual函数的调用不做inline,virtual意味着运行时才决定调用哪个函数。 
    5,某个类的构造函数看起来是空的,使用inline合适,其实是错误的想法; 
    C++的对象在被创建和销毁时:创建一个对象,每个base class及每个成员会自动构造;销毁一个对象时,反向进行析构及销毁;如果遇到异常,编译器尝试的模板代码更多;一旦被inlined,所有子类都要插入base class构造函数的所有自动生成的代码,急速膨胀。 
    6,inline函数无法随着程序库的升级而升级。如果程序库中的f()重写了,inline函数必须重写编译。 
    7,多数调试器对调试inline函数无能为力(可在DEBUG版本中禁用inline)。

    小结

    1,将多数inline声明在小型,频繁调用的函数身上,为日后的调试和升级更容易,也可能使代码膨胀的问题最小化,提升程序性能; 
    2,不要把所有头文件中template函数inline。

    参考

    《Effective C++ 中文版》(第三版)

  • 相关阅读:
    日志管理
    LAMP源码编译安装
    实现LAMP架构
    mariadb-server安装问题(Error: MariaDB-common conflicts with 1:mariadb-libs-5.5.60-1.el7_5.x86_64)
    MySQL之八---Mysql实现数据库主从复制、主主复制、级联复制、半同步复制及复制监控
    httpd-2.4源码编译
    HTTPD之三----HTTPS加密技术及重定向
    HTTPD之二---HTTPD服务详解——httpd的配置文件常见设置
    HTTPD之一---HTTPD服务基础理论
    MySQL的MHA实现高可用性
  • 原文地址:https://www.cnblogs.com/edisongz/p/7004542.html
Copyright © 2011-2022 走看看