文章目录
- 一.内联函数概念
- 二.内联函数用法
- 三.内联函数的特性
- 四.内联函数和宏
一.内联函数概念
以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。
二.内联函数用法
inline void swap(int& x, int& y)//内联函数
{
int tmp = x;
x = y;
y = tmp;
}
int main()
{
int x = 10;
int y = 20;
swap(x, y);
cout << x << ' ' << y << endl;
return 0;
}
普通函数在调用的时候会开辟函数栈帧,而内联函数是直接替换,在调用内联函数的地方进行展开。
在release模式下可以通过调试->右键代码->反汇编中看到效果,而debug模式下需要手动设置,因为debug模式下,编译器默认不会对代码进行优化,以下给出vs2013的设置方式:
通过汇编可以发现调用swap不是通过call指令转到swap函数之后在执行,而是直接将swap函数展开:
三.内联函数的特性
- inline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会用函数体替换函数调用,缺陷:可能会使目标文件变大,优势:少了调用开销,提高程序运行效率。(这里的空间是指可执行程序体积会变大)
- inline对于编译器而言只是一个建议,不同编译器关于inline实现机制可能不同,一般建议:将函数规模较小(即函数不是很长,具体没有准确的说法,取决于编译器内部实现)、不是递归、且频繁调用的函数采用inline修饰,否则编译器会忽略inline特性
- inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址了,链接就会找不到。所以这里建议不要去声明了,直接在.h文件或者要用的地方直接定义就行。
四.内联函数和宏
宏的优点:
1.增强代码的复用性
2.提高性能
宏的缺点:
1.不方便调试
2.变量没有类型安全的检测(只是纯粹的替换)
3.在有些地方用起来繁琐,容易出错
4.导致代码可读性差,可维护性差
因为宏有很多缺点,所以C++建议
1.一般的宏常量用const,enum枚举来替换
2.简单的宏函数用内联函数去替换