普通函数、宏函数、内联函数、静态函数的对比

本文深入探讨了普通函数、宏函数、内联函数、静态函数在编译时的指令生成情况,对比了各自的优缺点,如效率、安全性、调试性及符号可见性。并通过实例解析了内联函数的适用条件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

宏函数的优点

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

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

宏函数的缺点

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

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

三、内联函数:

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

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

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

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

四、静态函数

根据调试我们发现静态函数和内联函数(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是几,就没法展开,所以这个递归函数不能被处理成内敛函数。(编译期的时候去的是存它值的地址的地方,运行的时候才去地址里取值)

七、小结:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值