C++内联函数(inline)详解

内联函数

   函数调用是有时间和空间开销的。程序在执行一个函数之前需要做一些准备工作,要将实参、局部变量、返回地址以及若干寄存器都压入栈中,然后才能执行函数体中的代码。在函数体中的代码执行完毕后还要恢复现场,将之前压入栈中的数据都出栈,才能接着执行函数调用位置以后的代码。
   内联函数是C++为提高程序运行速度所做的一项改进。内联函数的编译代码与其他程序代码“内联”起来了,也就是说,编译器将使用相应的函数代码替换函数调用,对于内联函数,程序无需跳到另一个位置处执行代码,然后再跳回来。因此,内联函数的运行速度比常规函数稍快,但代价是需要占用更多的内存。如果程序在10个不同的地方调用同一个内联函数,则该程序将包含该函数的10个代码拷贝。
   在使用过程中,应该有选择的使用内联函数,如果函数体代码比较多,需要较长的执行时间,那么函数调用机制占用的时间可以忽略;如果函数只有一两条语句,那么大部分的时间都会花费在函数调用机制上,特别是这种比较短小的函数经常被调用,那么这种时间开销就不容忽视了。

内联函数的使用方法

  使用内联函数只要采用下列措施之一就可以了:

  1. 在函数声明前加上关键字 inline。
  2. 在函数定义前加上关键字 inline。
    通常的做法是省略原型,将整个定义(即函数头和所有函数代码)放在本应该提供原型的地方。
    如果是在多文件编程时,建议将内联函数的定义直接放在头文件中,并且禁用内联函数的声明(声明是多此一举)

    例如:
#include <iostream>
using namespace std;
//内联函数,交换两个数的值
inline double square(double x){return x * x;}

int main(){
    ....
}
内联函数与宏定义

   宏定义是可以带参数的,不过和函数还是有一定的区别。宏定义仅仅是字符串替换,不是按值传递的,所以在编写宏定义时要特别小心。例如:

#define  SQUARE(X)  X*X

a = SQUARE(4);    //被替换成 a = 4 * 4
a = SQUARE(4 + 1);    //被替换成 a = 4 + 1 * 4 + 1,这里和我们的设计初衷就不一样了。

  内联函数与宏定义不同,C++编译器在编译时也会对内联函数进行错误分析。它在某种角度上看,有点像标签,即内联函数在编译时也会直接替换相应的标签,但是内联函数提供给程序员的样子却是一个函数的形式。可以把内联函数看做是宏定义的高级版本。inline 修饰的函数在运行时没有函数调用的开销的,但是对外又表现出函数的形态。因此,如果使用C语言的宏定义执行了类似函数的功能,应考虑将它们转换为C++的内联函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值