首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【C++】内联函数 ② ( 内联函数不能单独声明 | C++ 编译器编译内联函数分析 | 内联编译 | 内联函数指令直接插入到调用位置 | 内联函数没有额外调用开销 )

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

作者头像
韩曙亮
发布2023-10-15 16:46:32
发布2023-10-15 16:46:32
7270
举报

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

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

1、普通函数声明

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

代码语言:javascript
复制
int fun(int a, int b)
{
    return a < b ? a : b;
}

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

代码语言:javascript
复制
int fun(int a, int b)

2、内联函数声明

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

代码语言:javascript
复制
// 内联函数
inline int fun(int a, int b)
{
    return a < b ? a : b;
}

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

代码语言:javascript
复制
inline int fun(int a, int b)

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

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

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

错误代码示例 :

代码语言:javascript
复制
// 导入标准 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、代码示例 - 内联函数进行内联编译过程

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

代码语言:javascript
复制
// 内联函数 : 获取 a 和 b 中较小的值
inline int fun(int a, int b)
{
    return a < b ? a : b;
}

int main() {

    // 调用内联函数
    int a = fun(1, 2);
    
    return 0;
}

在编译时 , 发现了 inline 关键字 , 此时会进行内联编译 , 将

代码语言:javascript
复制
int a = fun(1, 2);

代码 , 替换为 内联函数 指令 , 即 :

代码语言:javascript
复制
int a = 1 < 2 ? 1 : 2;

内联编译后的代码效果为 :

代码语言:javascript
复制
int main() {

    // 调用内联函数
    // 内联编译后的效果
    int a = 1 < 2 ? 1 : 2;
    
    return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-09-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、内联函数不能单独声明
    • 1、普通函数声明
    • 2、内联函数声明
    • 3、错误代码示例 - 内联函数声明
  • 二、C++ 编译器编译内联函数分析
    • 1、内联编译 与 内联函数
    • 2、内联函数指令直接插入到调用位置
    • 3、内联函数没有额外调用开销
    • 4、代码示例 - 内联函数进行内联编译过程
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档