如下代码
using namespace std;
int sum(int a,int b){
return a + b;
}
int main(){
int a =1;
int b =2;
int ret =sum(a,b);
return 0;
}
上面sum函数调用,会涉及到参数压栈,函数栈帧的开辟及回退过程,因此在函数调用的过程时候是会有开销的
sum函数的核心功能转成汇编指令即 1:将x的值放入寄存器 2:再将y的值和寄存器内容相加
为了使用这个非常简单的功能,我们需要做许多额外的动作,例如压函数参数入栈,压下一条执行指令地址入栈,将main函数的栈底指针压栈,为sum 函数开辟栈帧,
这一些系列动作产生的汇编指令远远多于x+y产生的指令, 这个就是说函数的调用开销远远大于函数功能指令,这种情况下我们可以考虑内联函数
如下代码
using namespace std;
inline int sum(int a,int b){
return a + b;
}
int main(){
int a =1;
int b =2;
int ret =sum(a,b);
return 0;
}
inline内联函数:在函数编译的过程中,就不会产生函数调用开销了,在函数的调用点直接把函数的代码进行展开处理了,
同时inline函数不再产生相应的函数符号
但是注意:不是所有的内联函数都会被编译器处理成内联函数,比如递归
所以inline只是建议编译器把这个函数处理成内联函数,结果取决于编译器,有没有内联成功可以 看看符号表,函数是否产生符号.
debug版本下,inline是不起作用,只有在release版本下才起作用
内联函数于普通函数有什么区别?
1:普通函数的调用会有函数开销
2:内联函数在编译的过程中,编译器会将函数代码做展开处理
3:如果内联成功,函数将不再产生符号表