C++ Primer中的陌生概念一:内联函数

来源:互联网 发布:现在做网络推广好做吗 编辑:程序博客网 时间:2024/05/22 23:42

213页介绍了内联函数:

我们编写了一个小函数:

const string &shorterString(const string &s1, const string &s2)

{

Return s1.size() <= s2.size() ? s1 : s2;

}

它的功能是比较两个string形参的长度并返回长度较小的string的引用。把这种规模较小的操作定义成函数有很多好处,主要包括:

1.阅读和理解shorterString函数的调用要比读懂等价的条件表达式容易得多。

2.使用函数可以确保行为的统一,每次相关操作都能保证按照同样的方式进行。

3.如果我们需要修改计算过程,显然修改函数要比先找到等价表达式所有出现的地方再逐一修改更容易。

4.函数可以被其他应用重复利用,省去了程序员重新编写的代价。

然而,使用shorterString函数也存在一个潜在的缺点:调用函数一般比求等价表达式的值要慢一些。在大多数机器上,一次函数调用其实包含着一系列工作:调用前要先保存寄存器,并在返回时恢复;可能需要拷贝实参;程序转向一个新的位置继续执行。

 

内联函数可避免函数调用的开销

将函数指定为内联函数(inline),通常就是将它在每个调用点上“内联地”展开。假设我们把shorterString函数定义成内联函数,则如下调用:

cout << shorterString(s1, s2) << endl;

将在编译过程中展开成类似于下面的形式:

cout << s1.size() <= s2.size() ? s1 : s2 << endl;

 

我试着使用了一下inline修饰符,但编译时出现unresolved external symbol未定义的错误。在网上搜索了一下答案,是因为,内联函数应该在头文件中定义,这一点不同于其他函数。编译器在调用点内联展开函数的代码时,必须能够找到linline函数的定义才能将调用函数替换为函数代码,而对于在头文件中仅有函数声明是不够的。

 

另外,在类内定义的成员函数全部默认是内联函数,可以显式加上inline修饰符,也可以不加。但是内联是给编译器的一种提示,编译器有权选择是不是内联。

0 0
原创粉丝点击