关于内置函数的发散思考

为什么C++要引入内置函数?因为调用函数需要时间和空间开销,下面解释一下函数调用的过程:

1:程序先执行函数调用前的语句(注意,这里不一定是main函数部分,也可能是其他函数)。

2:流程的控制转移到被调函数的入口处,同时进行参数传递

3:执行被调函数的函数体的语句。

4:流程返回主调函数的下一条指令处,将函数的返回值带回。

5:继续执行主调函数未执行的部分。

为什么需要大量的时间和空间开销呢?

1:需要在转去被调函数之前,记下当时执行指令的地址(毕竟还得回来。。。)还要保护现场<=>记下当时有关信息(回来时还要恢复当时的信息)

2:在函数调用之后流程返回到先前记下的地址处,并且根据记下的信息“恢复现场”,然后继续执行。

这些都需要花费一定的时间。

所以内置函数就诞生了,对于内置函数,C++在编译的时候就将所调用函数的代码直接嵌入主调函数中而不是将流程转出去。并且inline这条指令是建议性的,编译系统会根据具体情况决定是否这样做。

下面贴一段代码:

#include<iostream>
using namespace std;
inline int max(int,int,int);
int main()
{
	int i=10,j=20,k=30,m;
	m=max(i,j,k);
	cout<<"max="<<m<<endl;
	return 0;
}
inline int max(int i,int j,int k)
{
	i=i>j?i:j;
	return i=i>k?i:k;
}
在编译的时候编译系统就把max(i,j,k)换成了max函数体的代码,这有点类似于宏,事实上C++引入内联函数就是对宏机制的改进和补充。

下面介绍一下什么是宏:

C++宏定义就是将一个标识符定义为一个字符串,源程序中该标识符均以该字符串代替,而且宏定义后是不能加分号的,如果加了分号,编译系统会把分号也当成字符串的一部分,这个过程是在预编译期间完成的,什么是预编译呢?

预编译又称作预处理,做一些代码替换工作,以及条件编译。

接着说内联,如果要调用十次max函数,那么在编译时先后十次将max代码复制并插入main函数中,这里提醒一下,内联函数的代码替换工作是在编译期间完成的,不是预编译。

还有一点,包含循环语句和switch语句的函数或一个递归函数是无法进行代码置换的,循环和递归很好理解,这样做得不偿失,必然要嵌入很多代码,更重要的是,在编译的时候,编译系统不知道什么时候结束,自然无法置换代码了。而switch,估计是代码太长了吧。

下面来谈谈类中的成员函数

我们知道一个成员函数可以在类体内定义,也可以在类体外定义,这二者在编译时有点区别

C++规定,在类体内定义的成员函数中如果不包括循环等控制结构C++系统自动的对他们作为内置函数处理。也就是说,在程序调用这些成员函数时,并不是真正的执行函数调用过程(如保留返回地址,记录有关信息等处理),而是把代码嵌入程序的调用点。

而在类体外定义的函数,系统并不把它默认为内置函数,调用这些成员函数的过程和调用一般函数的过程是相同的。这时,我们就当用inline做显示声明了

特别注意:如果在类体外定义inline函数则必须将类定义和成员函数的定义都放在同一个头文件中(或者写在同一个源文件中)!

 注意:可以在声明函数和定义函数的同时写inline也可以只在函数声明时加inline,而在定义时不加inline。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值