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

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. Yii入门,登录

    验证和授权在页面需要限制访问时用到.验证就是确认某人就是他所声称的那个人.通常涉及到用户名和密码,但也包含其他方式,例如智能卡,指纹等.授权是在验证用户后,查明他是否被允许管理指定的资源.通常判断他是 ...

  2. ppt打不出中文

    1. 安装微软输入法2007就可以解决了 这个是微软的一个bug,在powerpoint 2007里面如果监测到你的注册表里面没有微软拼音输入法2007的话,就不能够打出中文. 2. 如果你不想安装微 ...

  3. 开扒php内核函数,第一篇 bin2hex

    这段时间真的比较有时间,所以自己用c写一下bin2hex啦 写个php的人都知道,这是个比较熟悉的函数吧,没有什么高深,只是把输入的东西以16进制输出吧了 先分析一下,这个函数要怎么写吧,他会有一定的 ...

  4. windows程序移植linux

    1,路径名统一用正斜杠“/”.(windows下正反斜杠都识别,linux只认正斜杠.) 2,统一使用UTF-8格式编码. vim中无法保存汉字时,可输入下列命令: :set fileencoding ...

  5. ZOJ-3201 Tree of Tree 树形DP

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3201 题意:给一颗树,每个节点有一个权值,求节点数为n的最大权子 ...

  6. 从数列1,2,3.......n 中 随意取几个数,使其和等于 m

    //从数列1,2,3.......n 中 随意取几个数,使其和等于 m           public static void Print(int n, int m, List<int> ...

  7. NetBeans平台中调用状态栏

    http://blog.csdn.net/mycsoft/article/details/2326386 StatusDisplayer stD = StatusDisplayer.getDefaul ...

  8. [翻译]Behavior-Driven Development (BDD)行为驱动开发(一)

    简单而言,BDD是一系列基于TDD的工具和方法集发展而来的开发模式,一般不认为是一种新的开发模式,而是作为TDD的补充.因此,首先对TDD的概念进行进行. 测试驱动开发(TDD) TDD模式采取的是迭 ...

  9. Bash's ArithmeticExpression

    [Bash's ArithmeticExpression] let command: let a=17+23 echo "a = $a" # Prints a = 40 let a ...

  10. java应用maven插件动态生成webservice代码

    pom.xml如下 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www ...