内置函数详解(inline)

17 篇文章 0 订阅

内置函数,又称内嵌函数 或 内联函数。

 

调用函数时需要一定的时间和空间开销,如图表示函数调用过程:

1:程序先执行a函数调用之前的语句

2:流程的控制转移到被调用函数入口

3:执行被调用函数的中的语句

4:流程返回调用函数的下一条语句,将函数返回值带回

5:接着执行主函数中未执行的语句

     这样要求在转去调用函数之前,要先记下当时执行的指令地址,还要记下当时有关信息,以便在函数调用之后继续执行。

在函数调用后,流程返回到先前记下地址处,并且根据记下的信息“恢复现场”,然后继续执行,这些都要花费一定时间。如果有

函数需要频繁使用,则所使用时间会很长,从而降低执行效率。

    使用内置函数可压缩时间开销,只需在函数首行左端加一个关键字inline即可。

#include<iostream>
#include<stdlib.h>


using namespace std;

inline int max(int,int,int);

int main()
{
	int m = 0,i = 10, j = 20, k = 30;
	m = max(i, j, k);
	cout << "max = " << m << endl;
	system("pause");
	return 0;
}

inline int max(int a, int b, int c)
{
	if (a < b) a = b;
	if (a < c)a = c;
	return a;
}

程序分析:

由于指定其为内置函数,因此编译系统遇到函数调用“max(i,j,k)”时,会用max的函数体代替“max(i,j,k)”,同时将实参代替形参。

所以 m = max(i,j,k);就被置换成:

if(i <  j )   i = j;

if(i <  k )  i = k;

 m = i;

注意:

1:可以在定义函数和声明函数时同时写inline,也可只在声明时加inline,定义时不加。只要在函数调用前把inline的信息告知编译系统,系统处理时就会按照内置函数处理。:

2: 内置函数可以节省运行时间,但增加了目标程序的长度,所以只有规模很小的情况下,函数调用时间开销超过本身执行时间就会声明为内置函数,可大大减少程序运行时间。

3:对函数作inline声明,只是对系统的一个建议,而不是指令,编译系统会根据情况决定是否这样做。

例如:复杂的循环语句,switch语句

总结:

只有规模较小而又被频繁使用的简单函数,才适合声明为inline函数!

经典例题

  • 使用inline关键字的函数会被编译器在调用处展开
  • 头文件中可以包含inline函数的声明
  • 可以在同一个项目的不同源文件内定义函数名相同但实现不同的inline函数
  • 定义在Class声明内的成员函数默认是inline函数
  • 优先使用Class声明内定义的inline函数
  • 优先使用Class实现的内inline函数的实现

A 项错误,因为使用 inline 关键字的函数只是用户希望它成为内联函数,但编译器有权忽略这个请求,比如:若此函数体太大,则不会把它作为内联函数展开的。(相当于这个关键字只是给编译器建议,不是指向命令)

B 项错误,头文件中不仅要包含 inline 函数的声明,而且必须包含定义,且在定义时必须加上 inline 。【关键字 inline 必须与函数定义体放在一起才能使函数成为内联,仅将 inline 放在函数声明前面不起任何作用】

C 项错误, inline 函数可以定义在源文件中,但多个源文件中的同名 inline 函数的实现必须相同。一般把 inline 函数的定义放在头文件中更加合适。

D 项正确,类内的成员函数,默认都是 inline 的。【定义在类声明之中的成员函数将自动地成为内联函数】

EF 项无意思,不管是 class 声明中定义的 inline 函数,还是 class 实现中定义的 inline 函数,不存在优先不优先的问题,因为 class 的成员函数都是 inline 的,加了关键字 inline 也没什么特殊的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值