C++ inline内联函数与普通函数的区别

#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只是建议编译器处理成内联,最终决定权在于编译器。

猜你喜欢

转载自blog.csdn.net/Gunanhuai/article/details/108637563
今日推荐