#include<iostream>
int sum(int x, int y)
{
return x + y;
}
int main()
{
int a = 10;
int b = 30;
int ret = sum(a,b);
std::cout << "ret:" << ret << std::endl;
return 0;
}
int ret = sum(a,b);
//这里有标准函数调用过程,参数压栈,函数栈帧开辟以及回退过程
//有函数调用开销
当函数的代码指令很多,函数调用开销指令以及回退指令和函数本身指令比起来没有可比性,此时应该封装成函数。
但在实际中有可能遇见函数的调用开销远远大于本身指令执行时间,此时就应该使用到inline内联函数。
inline内联函数:在编译过程中,就没有函数开销了,在函数调用点直接将函数代码展开。
内联函数,编译器处理时,在int ret =sum(a,b);处展开,将a给x,b给y;int ret =sum(a,b)直接变成了int sum=a+b;节省了函数调用开销。
inline函数不会再生成相应的函数符号
inline只是建议编译器将此函数处理为内联函数,决定要不要执行为内联函数决定权在于编译器,开发人员只是建议。不是所有的函数都会被编译器处理为内联函数,例如递归函数,因为编译器不执行指令,不知道递归条件,自然无法执行内联操作。当函数体中代码量过多时,编译器也不会将之定义为内联函数,因为代码量过多,在调用点展开时可能会发生一些未知错误。
在debug版本下,inline不起作用,只有在release下才能出现。
例如在linux下使用 gcc -c main.cpp -o 生成.o文件 ,objdump -t main.o查看符号表时,找不见sum函数的符号,因为sum被内联,不生成符号。
inline内联函数与普通函数的区别:
1.普通函数调用有标准函数调用开销,inline内联函数在编译过程中,没有函数开销,在函数调用点直接将函数代码展开;
2.inline函数不会再生成相应的函数符号;
3.inline只是建议编译器处理成内联,最终决定权在于编译器。