" inline " 关键字 , 必须与 函数名声 和 函数实现 , 写在一起 , 不能单独声明 ;
我们定义一个 普通函数 如下 :
int fun(int a, int b)
{
return a < b ? a : b;
}
可以 在 头文件 或 其它位置 声明 普通函数 :
int fun(int a, int b)
inline 内联函数 不能进行单独的声明 , inline 关键字只要使用了 , 必须有完整的 函数声明 与 函数实现 ;
// 内联函数
inline int fun(int a, int b)
{
return a < b ? a : b;
}
下面的用法是错误的 ( 错误示例 ) : 不能 只声明 inline 函数 , 内联函数如果没有 方法体 , 就是错误的 ;
inline int fun(int a, int b)
上述声明 , 在 Visual Studio 中不会报错 , 仍然可以正常编译运行 ;
下面的代码中 , 使用了 inline int fun(int a, int b); 声明内联函数 , 在 Visual Studio 2019 中不会报错 , 程序能正常运行 , 但是不建议这样做 , 在其它环境和平台会报错 ;
错误代码示例 :
// 导入标准 io 流头文件 其中定义了 std 命名空间
#include
// 导入 std 命名空间
using namespace std;
// 声明内联函数 不会报错 程序能正常运行
// 但是不建议这样做
inline int fun(int a, int b);
// 宏代码片段 : 获取 a 和 b 中较小的值
#define FUN(a, b) ((a) < (b) ? (a) : (b))
// 内联函数 : 获取 a 和 b 中较小的值
inline int fun(int a, int b)
{
return a < b ? a : b;
}
int main() {
// 调用内联函数
int a = fun(1, 2);
// 打印内联函数调用结果
printf("a = %d\n", a);
// 控制台暂停
system("pause");
return 0;
}
执行结果 :
C++ 编译器 在 编译代码时 , 如果发现 函数 前面有 " inline " 关键字 ,
就会对该 函数 进行 " 内联编译 " ,
上述 进行 " 内联编译 " 的函数 , 就是 " 内联函数 " ;
生成代码时 , 在生成的 库 中 , 是找不到 " 内联函数 " 的 ,
C++ 编译器 直接 将 内联函数 的 CPU 指令 , 插入到了调用 内联函数 的位置 ;
" 内联函数 " 的性能非常高 , 没有 函数调用 的额外开销 ;
函数调用 的 额外开销 包括 :
等操作 ;
内联函数 和 内联函数 调用代码 :
// 内联函数 : 获取 a 和 b 中较小的值
inline int fun(int a, int b)
{
return a < b ? a : b;
}
int main() {
// 调用内联函数
int a = fun(1, 2);
return 0;
}
在编译时 , 发现了 inline 关键字 , 此时会进行内联编译 , 将
int a = fun(1, 2);
代码 , 替换为 内联函数 指令 , 即 :
int a = 1 < 2 ? 1 : 2;
内联编译后的代码效果为 :
int main() {
// 调用内联函数
// 内联编译后的效果
int a = 1 < 2 ? 1 : 2;
return 0;
}