内联函数:就是在函数前加inline 让函数在调用的地方直接展开
可是内联函数有什么作用呢??
我们都知道,如果调用一个函数的话,会建立栈帧,在建立栈帧的时候会进行压栈等一系列操作。
而内联函数会在调用的地方展开,并不会建立栈帧。
下面我们来看一下
如果我们像调用这个函数的话,我们可以看一下它的汇编代码
我们可以看到,它的汇编里面是call了这个函数。call就是调用这个函数,如果一旦调用话就会建立栈帧
上面是我们普通的函数,如果像让它成为内联函数,那么就在它前面加inline
这样外前面加inline就是内联函数了,那么我们来看一下它的汇编代码
我们可以看到,我们调用这个函数的时候是直接展开了,而并不是去call这个函数
那么所有的函数都可以成为内联函数吗??
我们可以想一下,内联函数是在调用的地方展开,如果代码量太大展开了会怎么样?
我们可以想到的是,如果代码量太大,并且有很多地方调用了这个函数,那么在编译连接之后五一会增加代码量,会让编译好的汇编代码膨胀,导致可执行文件变大,这样就得不偿失了。
那么只有代码量太大不可以成为内联函数吗?
实际上我们的递归函数也不可以成为内联函数,还有就是声明和定义分离也不可以
下面给大家看一下
这样是代码量过多,我们就不能是内联函数了
而代码量多,怎么样才算多呢??
在vs下10行以上就不可以成为内联函数了
下面再看一下递归可不可以
实际上递归也是不可以的
还有就是声明和定义分离也不可以
那么内联函数在什么情况下适合呢?
我们可以想一下,内联函数是在调用的地方展开,可以减少建立栈帧的开销,并且代码量不能太大,所以根据这个条件我们就可以想到,内联函数适应于,代码短小,并且频繁被调用的函数。