几种函数的对比

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/YL970302/article/details/83715755

一、查看普通函数调用时的生成指令的情况,根据下图我们会发现它在进行函数调用的时候产生了很多的指令,所以我们说它的效率低

二、查看宏函数在编译的时候生成的指令数

宏函数的优点

(1)效率高(在编译的时候生成的指令少)

(2)不存在栈帧的开辟、不存在参数的代入、不存在返回值带出、不存在参数的清除

宏函数的缺点

(1)不安全,我们知道宏是在预编译的时候就会进行展开的,而在预编译的时候编译器是不进行类型检查的,所以说宏函数不存在类型,即不安全

(2)不可调试,在上图中我们发现,在调试宏函数的时候根本进不到宏函数里,所以说它不可调试,会在调用点展开

三、内敛函数:

形式:在普通函数前面加上关键字inline

(1)内敛函数在debug版本中,我们发现它会在调用点展开

(2)内敛函数在release版本下是调试不了的,但是会在调用点展开,根据反汇编窗口中的显示我们可以看出,根本没有生成指令(不会产生符号),不进行相关的栈帧等操作

在debug版本中,相对于宏函数来讲我们的内敛函数会在调用点进行展开,并且还会进行类型的检查,内敛函数是在编译时期展开的,并且进行了相关的栈帧操作

四、静态函数

根据调试我们发现静态函数和内敛函数相似,它们都可以在调用点进行展开,并且都会进行类型的检查,并且会进行相关的栈帧操作

五、local符号和global符号

当我们声明一个函数是静态函数或者是inline函数的时候,外部文件如果想要使用这两个函数即使使用extern关键字也是不可以使用的,因为这两个函数在编译的时候产生的是一个local符号,只能在本文件内使用,而普通函数则可以通过extern关键字被调用,因为它在编译的时候产生的是global符号,整个项目都可以用。

、请问内敛函数一定会展开吗?

答:不一定,因为inline函数是对编译器的一个建议,编译器会在具体的情况下考虑是否处理成内敛

实例:

int fun(int n)//n = 5
{
    if(n == 0)
    {
	return 0;
    }
int sum = n;
sum += fun(n-1);
return sum;
}

这个递归函数要在编译期进行展开,但当我们想展开的时候并不知道n是几,就没法展开,所以这个递归函数不能被处理成内敛函数。(编译期的时候去的是存它值的地址的地方,运行的时候才去地址里取值)

七、小结:

猜你喜欢

转载自blog.csdn.net/YL970302/article/details/83715755
今日推荐