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

内联函数是C++有别于C的特性之一。是为了提高程序运行速度所做的一项改进。常规函数和内联函数之间的主要区别不在于编写方式,而在于C++编译器如何将它们组合到程序中。要了解内联函数与常规函数之间的区别,必须深入到程序内部。常规函数执行时,计算机总是在机器指令之间来回跳跃并记录跳跃位置,这需要一定的开销。C++内联函数提供了另一种选择,内联函数的编译代码与其他程序代码“内联”起来了,编译器将使用相应的函数代码替换函数调用。对于内联代码,程序无需跳到另一个位置执行代码,再调回来。因此内联函数的运行速度比常规函数稍快,但代价是需要占用更多内存。
我们编写了一个小函数:
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;

测试代码如下:
// testInlineFun.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <string>
using namespace::std;

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

int main()
{
	string s1 = "hello";
	string s2 = "world!";
	string s3 = shorterString(s1, s2);
	cout << s3 << endl;


    return 0;
}

const string &shorterString(const string &s1, const string &s2)
{
	return s1.size() <= s2.size() ? s1 : s2;
}

要使用内联函数这项特性,必须采取下面的措施之一:

1)在函数声明前加上关键字inline;
2)在函数定义前加上关键字inline;
通常做法是省略原型,将整个定义放在本应该提供原型的地方。
使用类时,函数定义位于类声明中的函数将自动成为内联函数。如果愿意,也可以将类外定义的函数成为内联函数。为此,只需在类实现部分中定义函数时使用inline限定符即可。但内联函数的特殊规则要求在每个使用它们的文件中都对其进行定义。确保内联定义对多文件程序中的所有文件都可用的、最简便的方法是:将内联定义放在定义类的头文件中。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值