C++ 知识点06 inline

C++ inline 内联函数

一、什么是 inline 内联函数

普通函数 :调用时要 跳转→执行→返回,有函数调用开销

inline 内联函数

编译时把函数代码直接原地嵌入到调用处省去函数跳转开销,提升执行效率。

一句话:用代码替换函数调用,不跳转、省开销

二、基础语法

cpp 复制代码
inline 返回值 函数名(参数列表)
{
    // 函数体
}

三、基础示例代码

cpp 复制代码
#include <iostream>
using namespace std;
​
// 定义内联函数
inline int add(int a, int b)
{
    return a + b;
}
​
int main()
{
    // 编译时直接把 add(a,b) 替换成 a+b 代码
    cout << add(10, 20) << endl;
    cout << add(5, 6) << endl;
​
    return 0;
}

编译器处理后等价于:

cpp 复制代码
cout << 10 + 20 << endl;
cout << 5 + 6 << endl;

没有函数调用跳转,直接原地展开


四、为什么要用 inline?

  1. 省去函数调用的栈开辟、跳转、返回开销

  2. 代码短小、频繁调用的函数,用 inline 性价比最高

  3. #define 宏更安全、有类型检查、可调试


五、类内成员函数 默认就是 inline

写在类里面直接定义的成员函数,自带 inline 属性,不用手动加。

代码演示:

cpp 复制代码
#include <iostream>
using namespace std;
​
class Person
{
public:
    // 类内定义,默认隐式 inline
    void show()
    {
        cout << "我是类内默认内联函数" << endl;
    }
};
​
int main()
{
    Person p;
    p.show();
    return 0;
}

如果类内声明、类外定义 ,要手动加 inline

cpp 复制代码
#include <iostream>
using namespace std;
​
class Person
{
public:
    void show(); // 类内声明
};
​
// 类外定义,必须加 inline
inline void Person::show()
{
    cout << "手动加 inline" << endl;
}
​
int main()
{
    Person p;
    p.show();
    return 0;
}

六、inline 适用场景 & 不适用场景

✅ 适合用 inline

  • 函数代码很短(1~5 行)

  • 被频繁调用(循环里多次调用)

  • 简单计算、取值、设置值函数

❌ 不适合用 inline

  • 函数体代码很长

  • 包含 循环、if 多分支、递归、switch

  • 虚函数(多态)

编译器有内敛优化 :你写了 inline,它觉得不合适也会自动变成普通函数,不保证一定内联。


七、inline 函数规则(必记)

  1. inline 函数定义要放头文件,多个文件包含也不会报重复定义错误

  2. 不能定义递归内联函数

  3. 包含循环、复杂逻辑不建议 inline

  4. 只是建议编译器内联,不是强制(编译器有权拒绝)

演示:多文件共用 inline

同一个项目多个 .cpp 调用同一个 inline 函数,不用怕重复定义,这是 inline 特性。


八、inline 函数 VS 宏定义 #define

1. 宏写法(不安全)

cpp 复制代码
#define ADD(a,b) a+b

坑:无类型检查、优先级容易出错、容易产生诡异 bug。

2. inline 写法(安全)

cpp 复制代码
inline int add(int a, int b)
{
    return a + b;
}

区别总结:

特性 宏 #define inline 内联函数
类型检查
安全度 低,易出 bug
可调试 不可调试 可调试
作用 纯文本替换 类型安全代码展开

代码对比坑点:

cpp 复制代码
#include <iostream>
using namespace std;
​
#define MUL(x) x*x
inline int mul(int x) { return x*x; }
​
int main()
{
    // 宏:3+2*3+2 = 11  出错
    cout << MUL(3+2) << endl;
​
    // 内联函数:(3+2)*(3+2) = 25 正常
    cout << mul(3+2) << endl;
​
    return 0;
}

运行结果:

cpp 复制代码
11
25

一眼看出:宏有语法坑,inline 更安全


九、知识点一句话总结

  1. inline 作用:小函数原地展开,省去调用开销

  2. 类内直接定义的成员函数 默认隐式 inline

  3. inline 是给编译器建议,不强制

  4. 短小、频繁调用的函数用 inline;有循环、递归、代码长别用

  5. 比宏 #define 更安全、有类型检查、可调试

  6. inline 函数适合写在头文件,多文件引用不报错

相关推荐
不会C语言的男孩20 分钟前
C++ Primer Plus 第8章:函数探幽
开发语言·c++
William_wL_23 分钟前
【C++】模板进阶
c++
MC皮蛋侠客7 小时前
Google Test 单元测试指南
c++·单元测试·google test
方也_arkling8 小时前
【Java-Day08】static / final / 枚举
java·开发语言
艾莉丝努力练剑8 小时前
【Linux:文件】Ext系列文件系统进阶
linux·运维·服务器·c++·文件系统·文件io·ext
风吹夏回8 小时前
Python 全局异常处理:从“满屏 try-except”到优雅兜底
开发语言·python
Chengbei118 小时前
一站式源码安全检测工具、云安全 / APP / 小程序源码敏感信息递归多层目录扫描AK、JWT、手机号、身份证等敏感信息
java·开发语言·安全·web安全·网络安全·系统安全·安全架构
llz_1129 小时前
web-第一次课后作业
java·开发语言·idea
小熊Coding9 小时前
Python爬取当当网二手图书项目实战!
开发语言·爬虫·python·beautifulsoup·requests·二手图书
秋99 小时前
Java项目运行5天左右自动宕机:系统性定位与解决方案
java·开发语言·python