0

0

c++中如何使用inline内联函数_c++内联函数提高执行效率方法【详解】

裘德小鎮的故事

裘德小鎮的故事

发布时间:2026-01-14 22:29:02

|

487人浏览过

|

来源于php中文网

原创

内联函数只是向编译器提出建议,是否内联由编译器根据函数大小、调用频率和优化级别等决定;适合手动加inline的包括头文件中的短小辅助函数、类内定义成员函数、模板函数等。

c++中如何使用inline内联函数_c++内联函数提高执行效率方法【详解】

内联函数不是“只要加 inline 就一定变快”,它只是向编译器提出一个建议,是否真正内联由编译器决定;盲目标记反而可能增大代码体积、降低指令缓存命中率。

哪些函数适合加 inline 关键字

编译器对内联的决策高度依赖函数体大小、调用频率和优化级别(如 -O2-O3)。真正适合手动加 inline 的,通常是:

  • 定义在头文件中、被频繁调用的短小辅助函数(比如 max(a, b)is_even(n)
  • 类内定义的成员函数(C++ 标准规定隐式为 inline,无需显式写)
  • 模板函数(通常必须定义在头文件里,inline 可避免 ODR 违规)
  • 不包含循环、递归、try/catch、或复杂表达式的函数

inline 不起作用的常见原因

即使写了 inline,编译器也可能忽略。典型情况包括:

  • 函数体过大(例如超过 10–20 行逻辑,或含 for 循环)
  • 启用了低优化等级(如 -O0),此时大多数编译器直接禁用内联
  • 函数地址被取过(例如赋给函数指针、或传入 std::function),编译器必须保留可寻址版本
  • 跨编译单元调用且未启用 LTO(Link-Time Optimization)时,定义不在调用点可见

如何验证某个函数是否真的被内联了

不能只看源码有没有 inline,得看生成的汇编。以 GCC/Clang 为例:

立即学习C++免费学习笔记(深入)”;

BlessAI
BlessAI

Bless AI 提供五个独特的功能:每日问候、庆祝问候、祝福、祷告和名言的文本生成和图片生成。

下载
g++ -O2 -S -o func.s main.cpp

打开 func.s,搜索该函数名:如果找不到对应函数标签(如 _Z3fooi),且其逻辑被展开到调用处,则说明已内联。也可用调试器观察:

  • 在调用点设断点,step into 进不去函数体 → 很可能已内联
  • objdump -d a.out | grep -A10 'call.*foo',若没看到 call 指令而是直接看到 mov/add 等操作 → 已展开

inline 更有效的性能手段

现代 C++ 中,过度关注 inline 往往本末倒置。真正影响执行效率的通常是:

  • 数据局部性(结构体字段顺序、数组 vs 链表)
  • 分支预测失败(比如随机条件跳转)
  • 缓存行对齐与 false sharing(多线程下)
  • 不必要的拷贝(优先用 const T& 或移动语义)
  • 编译器优化开关本身(-O2 -march=native -flto 比手加一百个 inline 更管用)

内联只是编译器优化流水线中的一环,它解决不了算法复杂度问题,也掩盖不了糟糕的内存访问模式。

相关专题

更多
c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

523

2023.09.20

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

195

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

187

2025.07.04

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

480

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

143

2025.12.24

function是什么
function是什么

function是函数的意思,是一段具有特定功能的可重复使用的代码块,是程序的基本组成单元之一,可以接受输入参数,执行特定的操作,并返回结果。本专题为大家提供function是什么的相关的文章、下载、课程内容,供大家免费下载体验。

475

2023.08.04

js函数function用法
js函数function用法

js函数function用法有:1、声明函数;2、调用函数;3、函数参数;4、函数返回值;5、匿名函数;6、函数作为参数;7、函数作用域;8、递归函数。本专题提供js函数function用法的相关文章内容,大家可以免费阅读。

163

2023.10.07

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

400

2023.08.14

Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

36

2026.01.14

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号