C++之内联函数

来源:互联网 发布:notepad js格式化插件 编辑:程序博客网 时间:2024/06/05 19:13

一、目的
提高程序运行速度所做的一项改进。

二、内联函数与常规函数的区别
编译过程的最终产品是程序——由一组机器语言指令组成。运行程序时操作系统将这些指令载入到计算机内存中,因此每条指令都有特有的内存地址。计算机随后逐步执行这些命令。
执行到函数调用指令时,程序将在函数调用后立即存储该指令的内存地址,并将函数参数复制到堆栈(位次保留的内存块),跳到标记函数起点的内存单元,执行函数代码(也许还要将返回值放入到寄存器中),然后跳回到地址保存的指令处。来回跳跃并记录跳跃位置意味着以前使用函数时,需要一定的开销。
C++内联函数提供另一种选择。内联函数的编译代码与其他程序代码“内联”起来了。也就是说,编译器将使用相应的函数代码替换函数调用。对于内联代码,程序无需跳到另一个位置处执行代码,再跳回来。因此,内联函数运行比常规函数快,但需要占用更多的内存。所以应选择性的使用内连函数。执行函数代码时间比处理函数调用时间长,则节省时间占整个过程的很小一部分。如果执行代码时间短,则内联调用则可以节约大部分时间。但由于这个过程非常快,尽管节约了大部分时间,但时间的绝对值并不大,除非该函数经常被调用。
节省时间但是消耗空间。

三、使用
在函数声明前加上关键字inline;
在函数定义前加上关键字inline;
(以上采取之一即可)

四、inline函数的规则

(1)、一个函数可以自已调用自已,称为递归调用,含有递归调用的函数不能设置为inline;

(2)、使用了复杂流程控制语句:循环语句和switch语句,无法设置为inline;

(3)、由于inline增加体积的特性,所以建议inline函数内的代码应很短小。最好不超过5行。
(4)、inline仅做为一种“请求”,特定的情况下,编译器将不理会inline关键字,而强制让函数成为普通函数。出现这种情况,编译器会给出警告消息。

(5)、在你调用一个内联函数之前,这个函数一定要在之前有声明或已定义为inline,如果在前面声明为普通函数,而在调用代码后面才定义为一个inline函数,程序可以通过编译,但该函数没有实现inline。

#include<iostream>using namespace std;inline double square(double x){    return x*x;}int main(){    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 square = "<< square(c++) <<endl;    cout<<"New c = "<< c <<endl;    return 0;}

该函数输出:
a = 25, b = 144;
c = 13, c square = 169;
New c = 14;

输出表明,内联函数和常规函数一样都是按值传递。

五、内联与宏
如果以上用宏:
#define square(x) x*x;
则程序输出:New c = 15
表明宏不是按值传递。

0 0
原创粉丝点击