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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值