目录
前言
内联函数
1. 概念
2.特性
前言
今天小编给大家带来的是内联函数的介绍,大家可能之前没有听过内联函数这个名词,那么今天就和小编一起认识一下这个朋友吧。
内联函数
我们每次在调用函数时都会开辟一个函数栈帧,那么过度的函数栈帧的开辟就会导致栈满崩溃的情况,也会在一定程度上影响程序调用的效率,那么我们接下来介绍的东西就是解决此类问题的。
1. 概念
#include<stdio.h>
int Add(int a, int b)
{
int c = a + b;
return c;
}
int main()
{
int ret = Add(1, 2);
return 0;
}
这里我们看到此处产生的反汇编代码:
很明显这里我们产生了call指令。
那么如果我们这里用内联函数修饰后,我们只需要关注该是否产生call指令的调用指令。
但是由于我们在默认的debug模式下,inline不会起作用,否则就不方便调试了,所以在查看之前我们需要进行一些设置,这里有两种查看方式如下:
1. 在release模式下,查看编译器生成的汇编代码中是否存在call 函数明
2. 在debug模式下,需要对编译器进行设置,否则不会展开(因为debug模式下,编译器默认不
会对代码进行优化)
那么我们具体设置方法如下:
首先右击项目名,我们就会出现如下界面,然后点击属性
然后就会出现如下界面:
这里我们点击C/C++,看到常规后将调试信息格式改为程序数据库,然后我们点击优化,把内联函数扩展改为只适用于_inline(/Ob1),即可。
最后点击应用就完成了我们的配置,然后接下来小编就给大家演示一下添加内联函数产生的效果:
#include<iostream>
using namespace std;
inline int Add(int a, int b)
{
int c = a + b;
return c;
}
int main()
{
int ret = Add(1, 2);
return 0;
}
那么这里我们看到反汇编代码:
我们这里明显没有看到,call调用函数的指令,所以我们可以看到这里的内联函数的确是被展开了。
2.特性
这里我们假设该函数编译后的指令是50行,假设有10000个位置调用该函数,那么不使用内联函数我们这里调用产生的指令是每次调用的指令和该函数指令,所以就是10000+50行,但是使用内联函数后就是10000*50行,这样就会导致可执行程序变大。