内联函数
前言
因为在函数调用中,会有资源的消耗,比如说函数调用是要创建栈帧的,假设一个函数要被频繁的调用,那就会造成资源消耗很大,为了解决这一的问题,C++就有了内联函数这个概念,它可以让程序对资源的消耗没有大,提高程序执行时的效率。
对于C语言来说,为了解决上述的问题,就是使用宏来解决。
1、概念
被关键字inline修饰的函数就是内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。
inline add(int x,int y)
{
return x+y;
}
2、内联函数注意点
1、内联函数的调用不适合用于代码段很长的函数。
2、内联函数的调用也不适合用于循环和递归的情况。
假设一个20行的函数需要调用一百次,在不是内联函数调用的情况下,只需要100+20条代码,因为函数调用的时候会call函数的地址,而不是展开这个函数;如果是内联函数调用的情况下,那么在一百次调用的地方都会展开,那就是100*20条代码,这样就会导致可编译程序变的很大。
3、内联函数的特点
1、在VSdebug下内联函数是不会展开的,而是和普通函数一样,因为在debug下,程序要支持被调,所以只有在release下才内敛函数才会展开。
2、编译器会自动去识别,这个函数能否成为内联函数,只要是:
(1)代码不是过长(约10行左右,取决于编译器)
(2)不是递归函数,函数使用的使用不频繁
上述两种情况都不满足的话编译器就会自动变成内联函数,如果都不符合编译器就会限制它成为内联函数
3、 inline不建议声明和定义分离(因为内联函数没有地址,那么定义与声明分离后,就call不到内联函数的地址,不来也不需要call),分离会导致链接错误。因为inline被展开,就没有函数地址
了,链接的时候就会找不到。
4、宏的优缺点
宏的优点:
(1)复用的强度高
(2)提高性能
宏的缺点
(1)不容易被调试,因为在预处理阶段,宏就被替换了
(2)可读性差,容易误用
(3)没有类型安全检测
所以在C++中函数代码量小的会用内联函数替代宏宏函数