C++学习之旅内联函数
2016-04-14 10:11
381 查看
C++内联函数
内联函数是C++为提高程序运行速度所做的一项改进,常规函数与内联函数之间的主要区别不在于编写方式,而在于C++编译器如何将它们组合到程序当中。要了解内联函数与常规函数之间的区别。必须深入到程序内部。
编译的最终产品是可执行程序----由一组机器语言指令组成。运行程序时,操作系统将这些指令载入到计算机内存中,因此每条指令都有特定过的内存地址。计算机随后将逐步的执行这些指令。有时(如果有循环或者分支语句时),将跳过一些指令,向前或向后跳到指定的地址。常规函数调用也使程序跳到另一个地址(函数地址),并在函数结束时返回。
下面更详细的介绍这一过程的典型实现。执行到函数调用指令时,程序将在函数调用后立即存储该指令的内存地址,并将函数参数复制到堆栈(为此保存的内存块),跳到标记函数起点的内存单元,执行函数代码(也许还需要将返回值放入寄存器中),然后跳回到地址被保存的指令处(这与我们看书的时候,看着看着想看一下目录,然后看完目录再跳回刚才我们看的地方继续看有点类似)。来回跳跃并记录跳跃位置意味着会带来一定的开销。
C++内联函数提供了另一种选择。内联函数的编译代码与其他程序代码“内联”起来了,也就是说,编译器将使用相应的函数代码替换函数调用。对于内联代码,程序无需跳到另一个地方处执行代码,然后再跳回来。因此,内联函数的运行速度比常规函数稍快。但代价是需要占用更多的内存(这也是以空间换时间的一个方面)。如果程序在10个不同的地方调用同一个内联函数,则该程序将包含该函数的10个代码拷贝。
我们应该有选择的使用内联函数。如果执行函数代码的时间比处理函数调用机理的时间长,则所节省的时间将只占整个过程的很小一部分,如果代码执行时间很短,则内联调用就可以节省非内联调用使用的大部分时间,另一方面,由于这个过程相当快,因此尽管节省了该过程的大部分时间,但节省的时间绝对值并不大,除非该函数经常被调用。
要使用这项特性,必须采取以下措施之一
:在函数声明前加上关键字inline
:在函数定义前加上关键字inline
通常的做法是省略原型,将整个定义(即函数头和所有函数代码)放在本应提供原型的地方。
程序员请求将函数作为内联函数时,编译器并不一定会满足这种要求。它可能认为该函数过大或注意到函数调用了自己(内联函数不能递归),因此不能将其作为内联函数;而有些编译器没有启用或实现这种特性。
程序示例如下:通过内联函数square()(计算参数平方)演示了内联技术
#include <iostream>
inline double square (double x)
{
return x*x;
}
int main()
{
using namespace std;
double a,b;
double c = 13.0;
a = square(5.0);
b = square(4.5 + 7.5);
cout << "a = " << a << ",b = " << b << endl;
cout << "c = " << c;
cout << ",c squard = " << squard(c++) << endl;
cout << "Now c = " << c << endl;
return 0;
}
/* 程序输出结果 */
a = 25,b = 144;
c = 13,c squard = 139
Now c = 14
输出表明,内联函数和常规函数一样,也是按照值来传递参数的,如果参数为表达式,如4.5+7.5,则函数将传递表达式的值(这里是12),这使得C++的内联函数远远超过C语言的宏定义。因为宏定义只做傻瓜式的替换。
相关文章推荐
- 图像增强-中值滤波
- C++静态成员和非静态成员的区别
- 从gcc的编译到makefile的引入
- 两非负整数的高精度加减乘除模C++模板
- C与C++动态分配,释放内存的区别
- C++问题小结--2.通过几个例子谈谈const与*
- C++语言笔记系列之十六——赋值兼容规则&多继承的二义性
- C语言strstr()函数:返回字符串中首次出现子串的地址
- C语言实现单链表,单链表面试题面试
- c语言typedef的用法
- C/C++基础知识01
- 日期类(C++实现)
- C++ 语言实现1加到100(初学者)
- C++走向远洋——35(友元,时间)
- C++消息分发模块框架的的突发奇想,不足之处欢迎指正
- c/c++ 语言 左右移位操作
- c++中vector用法
- c语言中的未定义行为
- C++源码网站
- c++默认类型转化