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

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. appdata文件夹有什么用途?C盘appdata可以删除吗?

    在内存紧张的时候,我们都会选择删除一些无关紧要的大文件来释放内存,有不少网友发现在系统C盘下有一个appdata文件夹,而且体积挺大的,不知道能不能删除,针对此问题,本文就为大家介绍appdata文件 ...

  2. 基于CentOS与VmwareStation10搭建Oracle11G RAC 64集群环境:4.安装Oracle RAC FAQ-4.4.无法图形化安装Grid Infrastructure

    无法图形化安装: [grid@linuxrac1 grid]$ ./runInstaller Starting Oracle Universal Installer... Checking Temp ...

  3. JS URL编码

    JS URL编码escape() 方法: 采用ISO Latin字符集对指定的字符串进行编码.所有的空格符.标点符号.特殊字符以及其他非ASCII字符都将被转化成%xx格式的字符编码(xx等于该字符在 ...

  4. 数学概念 z

    数学是很难的科学,但因为它是科学家用数学来解释宇宙的语言,我们无可避免的要学习它.看看下面的这些 GIF 动图,它们提供了视觉的方式来帮助你理解各种数学技巧. 1.椭圆的画法 2.杨辉三角问题(Pas ...

  5. CMDB反思4

    CMDB模型设计2 http://blog.vsharing.com/xqscool/A1275233.html 估计大家看到破子的这两篇都有点晕哈,我也有点晕. 两篇对比来看.   第1处,属性部分 ...

  6. python与saltstack动态传参变量名的研究

    python动态变量名 import sys createVar = locals() listTemp = range(1,10) for i in range(1, len(sys.argv)): ...

  7. 将Tomcat注册为Windows服务

    1.从官网http://tomcat.apache.org/下载Tomcat. 2.将Tomcat压缩文件解压到相应的路径下(例如E:\TomcatServer) 3.从bin目录下找到service ...

  8. 【Java多线程】互斥

    Java多线程学习2——互斥 一.前言 在上一节 (http://www.cnblogs.com/lzhen/p/3917966.html) 中,通过实现Runnable接口,可以实现多线程中的资源的 ...

  9. xshell 上传 下载文件

    借助XShell,使用linux命令sz可以很方便的将服务器上的文件下载到本地,使用rz命令则是把本地文件上传到服务器. sz用法: 下载一个文件 sz filename 下载多个文件 sz file ...

  10. openstack 基本配置