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

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函数是个很常用的功能,但是也不能滥用。

C++的优秀特性2:inline 函数的更多相关文章

  1. C++的优秀特性1:引用

    (转载请注明原创于潘多拉盒子) 一本典型的C语言教科书的厚度大约是200页左右,而一本典型的C++教科书的厚度至少要500页.比如K&R的<The C Programming Langu ...

  2. c里面的static inline函数

    一般来说加上static表示函数是文件作用域,有的时候单独使用inline编译器会优化,没有编译成内联函数,而是变成普通函数编译,所以必须在前面加上static,放在头文件中可以被外部文件访问.   ...

  3. 总结Codeigniter的一些优秀特性

    总结Codeigniter的一些优秀特性 近期准备接手改进一个别人用Codeigniter写的项目.尽管之前也实用过CI,可是是全然按着自己的意思写的,没按CI的一些套路.用在公众的项目,不妨按框架规 ...

  4. C语言inline函数(转)

    原文链接:http://blog.csdn.net/yuan1125/article/details/6225993 1  inline只是个编译器建议,编译器不一定非得展开Inline函数. 例如: ...

  5. 【知识点】inline函数、回调函数、普通函数

    目录 一.inline内联函数 1.1 使用 1.2 编译器对 inline 函数处理步骤 1.3 优缺点 1.3.1 优点 1.3.2 慎用内联 1.3.3 不宜使用内联 1.4 虚函数(virtu ...

  6. 理解C++的inline函数

    C++的inline函数就是编译器在编译代码时,将"对此函数的每一个调用"都以函数本体替换之,该过程发生在编译期间. inline函数的优点是,它可以省去函数调用所带来的额外开销, ...

  7. C++ inline函数

    本文主要记录了C++中的inline函数,也就是内联函数,主要记录了以下几个问题: C++为什么引入inline函数? 为什么inline能很好的取代表达式形式的预定义? inline函数的使用场合 ...

  8. inline函数的用法

    在c/c++中,为了解决一些频繁调用的小函数大量消耗栈空间或是叫栈内存的问题,特别的引入了inline修饰符,表示为内联函数.栈空间就是指放置程式的局部数据也就是函数内数据的内存空间,在系统下,栈空间 ...

  9. effective c++:inline函数,文件间编译依存关系

    inline函数 inline函数可以不受函数调用所带来的额外开销,编译器也会优化这些不含函数调用的代码,但是我们不能滥用Inline函数,如果程序中的每个函数都替换为inline函数那么生成的目标文 ...

随机推荐

  1. Spring工厂方式创建Bean实例

    创建Bean实例的方式: 1) 通过构造器(有参或无参) 方式: <bean id="" class=""/> 2) 通过静态工厂方法 方式: &l ...

  2. Delphi 调用串口例子

    procedure TfrmClientMain.SayAddr;var sbuf:array[1..7] of byte;begin sbuf[1]:=byte($35); sbuf[2]:=byt ...

  3. jQuery 关于点击菜单项,使子条目“向上”展开效果的实现

    为什么做了这样一个的功能呢?原因是前一段时间jQuery群里有个朋友想实现这样一个东东,大家都知道jQuery中有现成的slideDown和slideUp方法,但那是向下展开,而这个是一个完全相反的效 ...

  4. bzoj1391 最大权闭合子图(also最小割、网络流)

    一道裸的最小割的题,写一下只是练练手. 表示被卡M,RE不开心.一道裸题至于吗? 再次复习一下最大权闭合子图: 1.每一个点若为正权,与源点连一条容量为绝对值权值的边.否则连向汇点一条容量为绝对值权值 ...

  5. mysql 用户权限

    创建用户 CREATE USER username IDENTIFIED BY 'password';

  6. Having the Result Set of a Stored Proc Sent to You by RSS Feed.

    Having the Result Set of a Stored Proc Sent to You by RSS Feed. by JBrooks   14. 十二月 2010 12:44 I wa ...

  7. logback打印不出日志

    原因: 1. 可能是jar包不完整 , 基本jar包包括:  logback-access , logback-core , logback-classic , perf4j , slf4j-api ...

  8. 无线网WEP的安全测试及防范

    650) this.width=650;" border="0" alt="" src="http://img1.51cto.com/att ...

  9. SQL SERVER安装提示“安装了 Microsoft Visual Studio 2008 的早期版本

    工作共遇到的问题记录: 安装Sql Server 2008 R2时提示错误:“此计算机上安装了 Microsoft Visual Studio 2008 的早期版本.请在安装 SQL Server 2 ...

  10. 4.VS2010C++建立DLL工程

    相关资料: http://blog.csdn.net/jshayzf/article/details/23608705 http://blog.csdn.net/huang_xw/article/de ...