内联函数
程序员文章站
2022-03-16 08:49:07
...
内联函数
关键字: inline
也叫镶嵌函数
- 函数调用需要建立栈内存环境, 进行参数传递, 并产生程序执行转移, 这些工作都需要一些时间开销, 有些函数使用频率高, 但是代码很短
- c++提供
inline
函数, 减少函数调用成本. - 编译器看到
inline
后, (一般)为该函数创建一段代码, 以便在后面每次调用都用一段代码来替换, 内联函数的初衷是为了空间换取时间的更快, 所以不能在内联函数内加上switch
和for
等语句, 避免代码量增大, 但是是否把当前函数作为内联函数并不是关键字就能决定的, 编译器会左右. - 内联函数的声明
- 内联函数可以在一开始仅声明一次
- 内联函数必须在调用之前被声明或定义, 因为内联函数的代码必须在替换之前已经生成被替换的代码
- 在实现的时候可以不用加
inline
- 递归函数不能被声明为内联函数
内联函数和宏定义
- 宏定义可以替换小函数, 但是有缺陷
- 宏定义告诉编译器简单的替换代码, 不检查参数类型
- 如果设计到运算的时候宏定义不能代表程序员的意图
- 宏定义的作用往往可以用内联函数代替, 并且相比具有了检查参数的作用
#include <iostream>
#define Max(a,b) (a) > (b) ? (a):(b)
inline int max(int a,int b)
{
return a > b ? a:b;
}
int main()
{
int a = 5;
int b = 3;
int d = Max(a++,b);
std::cout << "d = "<< d << "a = "<< a << std::endl;
d = max(a++,b);
std::cout << "d = "<< d <<"a = "<< a << std::endl;
return 0;
}
/*
在centos 7.3版本中结果如下
[[email protected] yinyong]$ g++ neilian.cpp
[[email protected] yinyong]$ ./a.out
d = 6a = 7
d = 7a = 8
说明在内联函数中的运行结果与我们期盼的一致, 但是宏定义出现偏差
原因如下:
Max(a++,b) (a++)>b?(a++):b
会替换成如下过程执行,执行结束a = 7,
*/