【C++】内联函数 ② ( 内联函数不能单独声明 | C++ 编译器编译内联函数分析 | 内联编译 | 内联函数指令直接插入到调用位置 | 内联函数没有额外调用开销 )





一、内联函数不能单独声明



" inline " 关键字 , 必须与 函数名声 和 函数实现 , 写在一起 , 不能单独声明 ;


1、普通函数声明


我们定义一个 普通函数 如下 :

int fun(int a, int b)
{
    
    
    return a < b ? a : b;
}

可以 在 头文件 或 其它位置 声明 普通函数 :

int fun(int a, int b)

2、内联函数声明


inline 内联函数 不能进行单独的声明 , inline 关键字只要使用了 , 必须有完整的 函数声明 与 函数实现 ;

// 内联函数
inline int fun(int a, int b)
{
    
    
    return a < b ? a : b;
}

下面的用法是错误的 ( 错误示例 ) : 不能 只声明 inline 函数 , 内联函数如果没有 方法体 , 就是错误的 ;

inline int fun(int a, int b)

上述声明 , 在 Visual Studio 中不会报错 , 仍然可以正常编译运行 ;

在这里插入图片描述


3、错误代码示例 - 内联函数声明


下面的代码中 , 使用了 inline int fun(int a, int b); 声明内联函数 , 在 Visual Studio 2019 中不会报错 , 程序能正常运行 , 但是不建议这样做 , 在其它环境和平台会报错 ;


错误代码示例 :

// 导入标准 io 流头文件 其中定义了 std 命名空间
#include <iostream>
// 导入 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++ 编译器编译内联函数分析




1、内联编译 与 内联函数


C++ 编译器 在 编译代码时 , 如果发现 函数 前面有 " inline " 关键字 ,

就会对该 函数 进行 " 内联编译 " ,

上述 进行 " 内联编译 " 的函数 , 就是 " 内联函数 " ;


2、内联函数指令直接插入到调用位置


生成代码时 , 在生成的 库 中 , 是找不到 " 内联函数 " 的 ,

C++ 编译器 直接 将 内联函数 的 CPU 指令 , 插入到了调用 内联函数 的位置 ;


3、内联函数没有额外调用开销


" 内联函数 " 的性能非常高 , 没有 函数调用 的额外开销 ;


函数调用 的 额外开销 包括 :

  • 压栈
  • 跳转
  • 返回

等操作 ;


4、代码示例 - 内联函数进行内联编译过程


内联函数 和 内联函数 调用代码 :

// 内联函数 : 获取 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;
}

猜你喜欢

转载自blog.csdn.net/han1202012/article/details/132643423