news 2026/9/3 0:45:49

一篇说明inline函数

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
一篇说明inline函数

一、什么是inline函数?(what)

inline的本意:把函数调用“展开”成函数体本身,用来减少函数调用的开销

普通函数

int add(int a, int b) { return a + b; } int x = add(1, 2); // 有一次函数调用

inline 函数

inline int add(int a, int b) { return a + b; } int x = add(1, 2);

编译器可能会变成类似:

int x = 1 + 2; // 直接展开

二、为什么要用 inline?(why)

1、 函数调用本身有开销:压栈、传参、跳转、返回。

函数被频繁调用,不断地有函数入栈,即函数栈,会造成栈空间或栈内存的大量消耗。为了解决这个问题,特别的引入了inline修饰符,表示为内联函数

2、 所以对于很短、调用频繁的函数inline可以提高效率。

三、inline是“建议”,不是命令

inline int f() { ... }

并不保证一定内联!

编译器会自己决定:函数太大 ❌、有递归 ❌、有复杂控制流 ❌

inline只是告诉编译器:我希望你内联

四、inline ≠ 一定快

1、内联是以代码膨胀(复制)为代价,仅仅省去了函数调用的开销,从而提高函数的执行效率

有时候反而更慢,因为内联会导致代码膨胀、指令缓存压力变大

2、所以inline 适合“短小、频繁”的函数

五、inline 的一个重要作用(容易忽略)

解决头文件重复定义问题(ODR)

// header.h inline int add(int a, int b) { return a + b; }
  • 头文件中的这个函数可以被多个.cpp包含

  • 在链接时不会产生“重复定义”错误

这点在头文件函数定义中非常重要(inline在这里更像“链接层面的语义”)

六、类内定义的成员函数,默认就是 inline

class A { public: int f() { return 1; } // 默认 inline };

等价于

inline int f() { return 1; }

七、总结

1、inline = 希望把函数调用变成代码展开

2、提高小函数性能

3、是建议,不是强制

4、头文件中定义函数常用

5、类内函数默认 inline


补充

对于 五、inline的重要作用中解决头文件重复定义问题(ODR)进行详细说明,

ODR:One Definition Rule

一、要弄清楚这一点,需要先搞清楚为什么会 出现头文件“重复定义”的问题?

举个例子

header.h:

int add(int a, int b) { return a + b; }

a.cpp:

#include "header.h"

b.cpp:

#include "header.h"

当开始编译时 会发现:

a.cpp 编译 → 里面有一个add函数定义
b.cpp 编译 → 里面也有一个add函数定义
链接阶段 就会报错,因为链接器看到:“同一个函数add,你给了我两个定义”

这就违反了ODR(One Definition Rule,唯一性定义规则)

于是报错:multiple definition ofadd

二、现在知道什么是头文件“重复定义”的问题了,那inline函数是怎么解决这个头文件重复的问题的?为什么它就可以解决呢?

1、是怎么解决的?

经过改变添加了inline函数过后

header.h:

inline int add(int a, int b) { return a + b; }

关键变化(重点)

inline 告诉编译器:这个函数允许在多个 cpp 中出现定义,只要这些定义 一模一样,就不算违反 ODR

也就是说:

a.cpp 里有一个 inline add

b.cpp 里也有一个 inline add

✅ 合法

2、为什么inline可以?

因为内联函数本来就可能被展开

add(1, 2)

可能直接变成

1 + 2

那每个.cpp自己“知道”函数内容是合理的
不需要全程序只有一个实体

所以标准就允许:
inline 函数在多个翻译单元中定义

3、static的区别

static函数(头文件中)

static int add(int a, int b) { return a + b; }
  • 每个.cpp各有一份独立函数,互相完全没关系,不会冲突

inline函数

inline int add(int a, int b) { return a + b; }
  • 看起来有多份,逻辑上是同一个函数,链接器允许它们共存

4、总结

头文件中定义函数,要么:inline、static、放进 class 里(默认 inline)

否则就很容易 链接错误

简单来说,inline不只是“优化用”,它还告诉链接器:这个函数允许在多个 cpp 中定义,不算重复。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/2 17:18:33

散户的困惑:谁在A股高速“收割”?揭秘量化交易的惊人真相

近期的A股市场波动剧烈,许多投资者都感到焦虑与不安,市场的下一步似乎越来越难以预测。您是否也曾疑惑,这背后是否有一股强大的“无形之手”,让市场变得如此动荡? 这股力量,很大程度上来自于一个我们既熟悉…

作者头像 李华
网站建设 2026/9/2 19:35:01

大模型应用开发实战:从踩坑到精通,收藏这篇就够了!

本文分享了一个智能问答系统的开发优化过程。针对三个不同子场景的智能问答需求,作者最初采用纯RAG技术建立三个知识库,但效果不佳,出现场景判断不清和召回率低的问题。后通过重新思考,改为按数据类型建立两个知识库(结…

作者头像 李华
网站建设 2026/9/2 0:05:32

Android RTMP客户端终极指南:轻量级流媒体解决方案

Android RTMP客户端终极指南:轻量级流媒体解决方案 【免费下载链接】LibRtmp-Client-for-Android It is probably the smallest(~60KB, fat version ~300KB) rtmp client for android. It calls librtmp functions over JNI interface 项目地址: https://gitcode.…

作者头像 李华
网站建设 2026/9/2 22:26:25

如何快速掌握Mermaid.js数学公式可视化:面向初学者的完整指南

如何快速掌握Mermaid.js数学公式可视化:面向初学者的完整指南 【免费下载链接】mermaid mermaid-js/mermaid: 是一个用于生成图表和流程图的 Markdown 渲染器,支持多种图表类型和丰富的样式。适合对 Markdown、图表和流程图以及想要使用 Markdown 绘制图…

作者头像 李华
网站建设 2026/9/1 23:33:34

网易云音乐脚本终极使用指南:解锁隐藏功能的完整教程

还在为网易云音乐的各种限制而烦恼吗?想要畅享周杰伦音乐却苦于版权限制?这款神奇的浏览器扩展脚本将成为你的音乐助手,带你体验前所未有的音乐自由!🎵 【免费下载链接】myuserscripts 油猴脚本:网易云音乐:云盘歌曲快…

作者头像 李华
网站建设 2026/9/2 9:38:38

阿里云万相Wan2.6深度实测:从AI生成到智能导演,重新定义短视频创作

一、AI 视频生成的「导演级」进化在短视频与影视内容井喷的当下,AI 视频生成技术正成为内容创作的新引擎。从早期简单的文生图到图生视频,AI 不断降低创作门槛,但传统模式局限于单镜头表达,难以构建复杂叙事。2025 年 12 月&#…

作者头像 李华