zoukankan      html  css  js  c++  java
  • C++的优秀特性2:inline 函数

    (转载请注明原创于潘多拉盒子)

    Inline函数是C++的一个很小的特性,在不计较效率的情况下,这个特性似乎可有可无。然而,C++天生是为最为广泛的应用场景设计的,因此,总会有关于效率的问题。其实,除了效率,inline函数还提供了另外一个便利:可读性。当一个函数比较小,比如只有一个return语句,那么把实现和声明分开不是一个很好的办法。比如如下的一个成员函数:

    class List
    {
    public:
        size_t getSize() const
       {
           return _size;
        } 
    private:
        size_t _size; 
    };
    

    如果将其中的getSize()函数的实现放在cpp文件中,则大大的不美:对于一个读者来读这个函数,可以在第一时间了解该函数的功能。效率也很高,几乎是访问成员变量一样的效率。

    一个函数是否inline跟这个函数声明时是否使用inline关键字没有关系,比如这个inline函数虽然没使用inline关键字来声明,但却是inline的。反之,使用inline函数声明,则不一定是inline的,比如该函数的定义如果放在cpp文件中,则不是inline的。

    使用inline来声明并在别处定义的inline函数,必须实在h文件中定义的:这很容易理解,因为inline是编译时行为,编译器需要将代码展开放在调用者代码中,因此编译器需要在h文件中看到定义。比如下面的例子:

    class List
    {
    public:
        size_t getSize() const;
    private:
        size_t _size; 
    };
    
    inline size_t List::getSize() const
    {
        return _size;
    }
    

    其中的getSize()就是一个inline函数。但如果变成:

    class List
    {
    public:
        inline size_t getSize() const
    private:
        size_t _size; 
    };
    
    // in cpp
    size_t List::getSize() const
    {
        return _size;
    }
    

    虽然在声明时使用了inline关键字,但定义却放在了cpp文件中,因此不是inline函数。

    虽然inline函数可以直接在声明处就地定义,也可以用inline关键字声明,再用inline关键字在h文件中定义,但是,出于以下的原因,建议在h文件中声明处就地定义。

    原则:

    1. inline函数的行数要很小,最好小于3行。因为如果inline函数很大, 那么调用的开销相对于执行的开销,就显得没那么大了,没必要inline。从可读性上来考虑,台大的函数实现会干扰可读性。

    笔者看到过很大的函数,还用inline来实现,实在是没有必要,而且画蛇添足了。

    建议:

    1. 构造函数、析构函数,使用inline来实现。可读性、效率需求。

    2. 简单的get、set函数,使用inline来实现。可读性、效率需求。

    3. 频繁调用的小函数,使用inline来实现。主要是效率需求。

    Inline函数是个很常用的功能,但是也不能滥用。

  • 相关阅读:
    正则表达式匹配整数和小数
    解决任务计划程序未启动任务,因为相同任务的实例正在运行的问题
    ActiveMQ 消息持久化到数据库(Mysql、SQL Server、Oracle、DB2等)
    C# CLR20R3 程序终止的几种解决方案
    彻底消除wine中文乱码,QQ,kugoo等等....
    Fedora如何添加第三方软件源?
    [转]Fedora 下安装NVIDIA显卡驱动(使用后无法进入图形界面)
    向fedora添加rpmfusion源
    [转]Java 8 Optional类深度解析(null处理)
    [转载]深入理解Java 8 Lambda
  • 原文地址:https://www.cnblogs.com/bqzhao/p/3538074.html
Copyright © 2011-2022 走看看