宏函数普通函数内联函数的区别
Posted 代二毛
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了宏函数普通函数内联函数的区别相关的知识,希望对你有一定的参考价值。
示例代码:
//宏函数
#define SUM(x) (x) + (x)
//内联函数
inline int sum(int x)
{
return x + x;
}
//普通函数
int sum(int x)
{
return x + x;
}
什么是内联函数
在普通函数定义时加上"inline"关键字。
内联函数与普通函数、宏函数的区别
与普通函数的区别:
1.定义时内联函数会加“inline”关键字修饰,内联函数就是在普通函数的基础上加“inline”修饰;
2.在调用内联函数的地方,是将内联函数的代码原封不动的复制一份放在该处,这和调用宏定义是一样的特性;而调用普通函数,是跳转到函数代码处进行执行,执行完再跳转回来。
3.在程序执行过程中,普通函数的代码段只有一份,调用函数时就跳转执行;而内联函数只要调用几次就会复制几份放到该处;(类似动态库和静态库的区别)
与宏定义的区别:
用宏定义也可以实现函数,并且和内联一样都是在调用时原封不动的展开;区别是宏函数是真的原封不动,不会检查参数的类型是否匹配,而内联函数会像普通函数一样检测传参类型。
总结:内联函数可以总结为“可以检查传参类型的宏函数”。既具有宏函数那样可以原地展开的特性,又具有普通函数检查传参类型的特性,是结合了宏函数和普通函数二者的特性。
什么情况下使用内联函数
1.函数本身内容比较少,代码比较短,函数功能相对简单。这种情况下,调用内联函数时不用多占用太多空间,并且函数跳转的时间比函数执行的时间长,使用内联函数可以提高效率。
2.函数被调用得频繁,在循环中的函数。
inline函数的使用限制
1.递归函数不能使用内联函数;
2.不能包含复杂的结构控制语句例如while、switch,所以内联函数的功能一般比较简单;
使用内联函数优劣势
优势:恰当的使用内联函数可以提高运行效率。避免了调用函数的来回跳转,节省了资源的占用;
劣势:内联函数的功能比较简单,不是所有函数都能定义为内联函数;因为调用内联实质是复制一份代码放在该处,所以编译后的可执行程序会更大,加载程序会占用更多的空间。
总结:内联函数要慎用,大多数情况下是用不上的,不然为什么inline是特殊关键字,没有每个函数都定义为内联函数。内联函数不是非用不可,本人工作中还没有使用过内联函数,只有在Linux内核代码中看到使用过。
定义为内联函数就一定会是内联函数吗?
定义成内联函数,但是编译后并不一定是内联函数。编译器将会根据函数的定义体,自动地取消不值得的内联。
以上是关于宏函数普通函数内联函数的区别的主要内容,如果未能解决你的问题,请参考以下文章