内联inline

《C++初阶之路》inline函数 为什么要有inline函数(内联函数)? 什么是内联函数? 为啥所有函数不都改成内联? 内联函数的使用场景 内联函数注意事项 阅读详情

一、什么是 inline?

inline 的本意是:

建议编译器将函数调用处展开成函数体代码,省去函数调用的开销。

inline int square(int x) 
{ 
    return x * x; 
}

当你调用 square(5) 时,编译器可能会将其替换成 5 * 5,从而避免函数调用栈、跳转、返回等开销。


二、inline 背后的行为(要点)

特性说明
 是建议inline 不是强制,最终是否展开,由编译器决定(取决于函数复杂度、编译选项等)
 展开代码如果内联,调用处替换为函数体,执行更快,但代码体积增大(可能导致指令缓存 miss)
 作用域规则inline 函数遵循 C++ 的作用域与类型规则
多次定义也 OKinline 允许函数在多个编译单元定义(详见 ODR 规则)

 三、适合使用 inline 的场景

  • 小型、频繁调用的函数(如 getter/setter、工具函数)

  • 函数体很短,只有几行,且调用非常频繁

  • 头文件中定义的函数(比如模板类成员函数)


 四、真实示例:性能优化与问题

🔹 示例 1:小函数优化

inline int add(int a, int b)
 { 
    return a + b; 
} 
int main() 
{ 
    int x = add(2, 3); // 编译器可能替换为:int x = 2 + 3; 
}
  • 如果 add() 是频繁调用的小函数,内联能显著减少函数调用成本;

  • 不用压栈、不用跳转、执行速度更快。


🔹 示例 2:写在头文件中

// myutils.h
inline int max(int a, int b) {
    return (a > b) ? a : b;
}
  • 如果你在多个 .cpp 文件中 #include "myutils.h":
  • 如果不加 inline,就会出现多个定义,违反 ODR(One Definition Rule);

  • 加了 inline,多个定义是合法的,编译器会合并。


 五、注意事项 & 误区

 1. 函数太大不适合 inline:

inline void heavyFunction() {
    // 函数体非常大
}

展开后的代码重复太多,可能导致 代码膨胀、指令缓存 miss、反而变慢。


 2. 使用递归、虚函数的函数不能 inline

  • 递归函数:不能展开自己

  • 虚函数:运行时多态,函数地址不确定,不能展开


 3. 编译器不一定听你的

inline int foo() {
    // ...
}
  • 编译器可能选择 不内联(太复杂、不常用等);

  • 也可能 自动内联 没有标记的函数(根据优化策略);

你也可以用 GCC/Clang 的 __attribute__((always_inline)) 强制内联(不推荐轻易用)。


 六、和宏 #define 的对比

特性inline#define
是否类型安全✅ 是❌ 否
是否调试友好✅ 可以打断点❌ 无法调试
是否受作用域限制✅ 有作用域❌ 无作用域
编译阶段编译期优化预处理期文本替换

 总结:

inline 是一种优化建议,适合小而频繁调用的函数,既能保持函数语义,又有宏的性能优势。

【C/C++】inline内联函数详解 内联函数在C++中是一种特殊的函数,内联函数的代码在编译时会在调用的位置展开,而不是在运行时调用函数。 这样做可以消除函数调用的开销,从而提高程序的执行效率。 相当于define宏替换 内联函数可以分为: 隐式内联函数:类内的函数(虚函数除外)都为隐式内联函数 显式内联函数:在类外使用inline关键字修饰的函数 阅读详情

相关推荐

【C++基础知识】将函数标记为 inline 一定就会内联吗?

在C++中,将函数标记为 inline 不保证函数一定会被内联。inline 关键字仅向编译器提供一个“建议”,最终的决策权在编译器自身。是否内联取决于编译器的优化策略、函数复杂度、调用上下文等因素

沐怡旸的专栏 1363

【C++】内联函数----inline函数的详细使用教程

今天我们来学习C++中的一个比较重要的关键字–inline函数(内联函数),码字不易,希望多多支持!!!因此宏函数极易出现错误。这个知识点容易出错,但是面试的时候易被问到。inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址了,链接就会找不到。只要是内联函数,函数定义与声明分离的时候,内联函数的函数地址不会进符号表,要不然还要判断编译器是否应用内联函数,这样太复杂了!!!1.一个冷知识:屏蔽力是一个人最顶级的能力,任何消耗你的人和事,多看一眼都是你的不对。

云小逸的博客 1万+

避坑指南:RFSoC数据转换器多片同步配置的7个致命错误

本文深入剖析了在配置RFSoC多片同步功能时,工程师最常遇到的七个致命错误。从Tile 0的强制启用、时钟域与SYSREF时序,到跨代器件兼容性、电源序列以及动态重配置的陷阱,文章结合实战经验,提供了从原理到调试的完整RF数据转换器配置指南,旨在帮助开发者高效构建相位一致的大规模射频采样系统。

weixin_28452161的博客 533

C++基础:inline函数

1.inline 函数 1.1定义:inline 函数由 inline 关键字定义,引入 inline 函数的主要原因是用它替代 C 中复杂易错不易维护的宏函数。 1.2编译器对 inline 函数的处理办法 编译器在编译阶段完成对 inline 函数的处理,即对 inline 函数的调用替换为函数的本体。但 inline 关键字对编译器只是一种建议,编译器可以这样去做,也可以不去做。从逻辑上来说,编译器对 inline 函数的处理步骤一般如下: (1)将 inline 函数体复制到inline..

weixin_58368590的博客 1万+

告别编译噩梦:Vcpkg+Cmake一站式集成Tesseract-OCR C++开发环境(Windows)

本文详细介绍了如何在Windows系统上使用Vcpkg和CMake快速集成Tesseract-OCR C++开发环境,解决传统编译过程中的依赖问题。通过一键安装和自动化配置,开发者可以高效搭建OCR识别系统,支持中英文识别,并提供了常见问题的解决方案和进阶技巧。

weixin_29009339的博客 231

VS2022 中 std::mutex 静态初始化陷阱:一次诡异崩溃的排查记录

VS2022中使用std::mutex时遇到的静态初始化陷阱问题。该问题源于VS2022 17.4版本为std::mutex添加constexpr支持后,全局静态初始化可能导致系统资源未就绪时锁失效或崩溃。文章分析了问题现象、影响范围,并提供了解决方案。最后给出了排查清单和核心建议

qq_34552942的博客 952

inline(内联函数)

内联函数的主要目的是为了提高程序的执行效率,特别是在小型、频繁调用的函数中。如果内联函数体较大,且在多个地方被频繁调用,编译器将函数体直接插入到调用点可能导致生成的二进制代码体积增加,造成代码膨胀。内联函数的工作原理是编译器在编译过程中将内联函数的代码直接插入到调用点,省去了函数调用的开销。通过消除函数调用的开销(如参数压栈、跳转等),内联函数可以加速程序的执行,特别是在频繁调用的小函数中效果明显。内联函数需要在每个调用点都插入函数代码,这会增加编译器的工作量,导致编译时间延长,特别是在大型项目中。

zjkoye的博客 6214

用PyTorch和snnTorch库5分钟搞定一个脉冲神经网络(SNN)手写数字识别Demo

本文详细介绍了如何使用PyTorch和snnTorch库快速搭建一个脉冲神经网络(SNN)手写数字识别Demo。通过模拟生物神经元的脉冲发放机制,SNN在低功耗场景中展现出独特优势。文章涵盖环境配置、数据预处理、模型构建、训练评估全流程,并提供了性能优化技巧和常见问题解决方案,帮助开发者在5分钟内实现高效的SNN应用。

weixin_29300931的博客 392

inline函数_inline内联函数

C++中的inline用法 - Boblim - 博客园​www.cnblogs.com1.引入inline的原因 为了解决一些频繁调用但代码量很小的函数引起的大量消耗栈空间(内存)的问题栈空间 用来存放程序的局部数据(函数内数据)的内存空间在系统中,栈空间是有限的,如果大量频繁的使用会造成因栈空间不足而导致的程序出错的问题,例如函数的死循环递归调用的最终结果就是导致占内存空间的枯竭。#...

weixin_39827775的博客 177

Materials Studio多层聚合物建模全流程:从Build Layers到LAMMPS data文件导出避坑指南

本文详细解析了使用Materials Studio构建多层聚合物模型并导出为LAMMPS data文件的全流程。重点剖析了Build Layers工具的核心逻辑、真空层处理技巧,并提供了解决导出过程中Z轴坐标偏移问题的实战方案,特别是如何利用msi2lmp工具的-shift参数进行精准校正,确保模型在LAMMPS中模拟的稳定性和准确性。

hhh00的博客 913

单相PWM整流器的数学模型、工作原理

单相PWM整流器的数学模型、工作原理

weixin_58670090的博客 1万+

从零开始的内联样式深度解析 display:inline

之前在公司写表单的时候遇到这样一个布局错乱的问题:按理来说应该并排排列的元素怎么会自己换行?虽然现在来看很快就能定位到问题,但由于之前一直使用flex布局没怎么使用过inline或inline-block所以当时也卡了挺久,为了避免这种问题再次发生,于是我决定彻底把这些内联元素的行为学透,以及怎么将以上的代码进行优化。

m0_74798823的博客 956

COLMAP性能优化实战:如何用GPU加速和并行计算让重建速度提升300%

本文详细介绍了如何通过GPU加速、并行计算和参数调优显著提升COLMAP的三维重建效率。从硬件资源分配到计算流程优化,再到大型数据集的分块处理策略,全面解析了将重建速度提升300%以上的实用技巧,特别适合处理无人机航拍和室内扫描等大规模三维重建项目。

weixin_29098391的博客 202

static __INLINE 内联函数

_inline函数也称为内联函数或内嵌函数,_inline定义的类的内联函数,函数代码被放入符号调用表,使用时直接展开,不需要调用,即在编译期间将所调用的函数的代码直接嵌入到主调函数中,是一种以空间换时间的函数。 内联函数有些类似于宏。内联函数的代码会被直接嵌入在它被调用的地方,调用几次就嵌入几次,没有使用call指令。这样省去了函数调用时的一些额外开销,比如保存和...

tyler880的专栏 7982

Sigrity System Explorer Transient Analysis模式进行瞬态仿真分析操作指导-差分信号

Sigrity System Explorer Transient Analysis模式可以用于瞬态仿真分析,通过搭建简易拓扑用于前仿真分析通道的时域性能,下面搭建一个简易的差分拓扑进行说明,以下图为例,准备好发送接收端的IBIS模型, (ibis_se.ibs,本例发送接收端都使用相同的IBIS模型),以及传输线的S参数模型(welement_se.sp)最上方的图形界面是传输线的模型,本例是一个上下都有参考平面的带状线,右侧的梯形是蚀刻角度,根据W1和W2以及铜厚来确定。

weixin_54787054的博客 440

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

inline内联类型函数(inline、__always_inline、noinline)

目录1. 定义2. 接口3. 优缺点4. inline、__always_inline、noline的区别5. 与宏的区别6. 验证inline的方法C程序编译为汇编 1. 定义 TODO 2. 接口 #define __inline__ inline #define __inline inline #define __always_inline inline __attribute__((always_inline)) #define noinline __attribute__((noinline))

EricTsai的专栏 6005

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

kotlin 内联函数 inline

总的来说,inline关键字让函数以内联的方式进行编译避免创建函数对象来处理kotlin高阶函数的天然性能缺陷。同时,之前的文章中提到的kotlin的泛型实化,也是利用了inline关键字可以内嵌函数代码的特性而衍生出来的全新功能。

Mark Wu 的博客 1188

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

inline内联函数

inline用于修饰函数。 ininle的作用是建议编译器简化函数调用开销,这也是inline的存在的意义   语句被编译器编译成机器指令,那么多翻译一条机器指令和少翻译一条指令,从机器指令的数量的角度上来说,少肯定比多好,假设我写了一份源代码,A编译器编译后100条指令,B编译器编译后10条指令,从数量的角度看,B编译的程序执行效率更加高   相同数量的指令,根据指令周期判断执行效率 ...

weixin_30561177的博客 132

c++ 内联函数inline

代码中函数调用包含着一系列工作:调用前要保存寄存器,并在返回时恢复。同时可能需要拷贝参数,程序还要转向一个新的位置继续执行。而通过inline关键字可以将函数指定为内联函数,也就是将内联函数代码放到调用点处执行。 内联函数一般用于代码规模较小、流程直接、频繁调用的函数。当我们 使用inline只是建议编译器“内联的”展开 ,而代码不符合代码块短小并且频繁调用的情况时,编译器会把它当作普通函数。 inline const int & minVal(const int &a, const int

风源- 793

【C++】深入基础——内联函数inline详解

inline内联函数(内置函数/内嵌函数) 前提了解: 函数调用 CPU一行行执行主调函数代码,在遇到被调用函数时,主调函数暂停,CPU去执行被调用函数的代码;当它执行完后 才返回主调函数,继续执行。这个过程有时间和空间的开销。 一个C/C++程序的执行过程可以认为是多个函数之间的相互调用过程,形成一个调用链条,链条起/终点为main()。 内联函数 在编译时就将函数调用处用函数体替换 #include <iost...

火锅底料_大伯的博客 554

关于__attribute__( ( always_inline ) ) __STATIC_INLINE定义内联函数的一些问题

最近移植软件,原编译器是GCC,移植到STM32上用ARMCC。 有几个库函数(htonl,ntohl,htons,ntohs)在标准库里没有,需要自己写。于是网上找了个模板比较简单,修改了下做成自己的函数。 然后想做成内联函数,于是加了__STATIC_INLINE(定义在core_cm4.h中)修饰。以htons为例,程序如下: // 模拟htons函数,本机字节序转网络字节序 __S...

fly__ome的博客 4788

内联函数inline

内联函数用关键字inline修饰的函数就是内联函数。关键字在函数声明和定义的时候都要加上。 内联函数与一般函数的区别 1)内联含函数比一般函数在前面多一个inline修饰符 2)内联函数是直接复制“镶嵌”到主函数中去的,就是将内联函数的代码直接放在内联函数的位置上,这与一般函数不同,主函数在调用一般函数的时候,是指令跳转到被调用函数的入口地址,执行完被调用函数后,指令再跳转回主函数上继续执行后面的代码;而由于内联函数是将函数的代码直接放在了函数的位置上,所以没有指令跳转,指令按顺序执行 3)一般函数的代码段

qq_35399548的博客 247

C++ inline 内联函数

C++ inline内联函数是一种提高程序执行效率的一种特性。

上善若水 1534

inline 内联函数

相当于把内联函数里面的内容写在调用内联函数处;相当于不用执行进入函数的步骤,直接执行函数体;相当于宏,却比宏多了类型检查,真正具有函数特性;不能包含循环、递归、switch 等复杂操作;在类声明中定义的函数,除了虚函数的其他函数都会自动隐式地当成内联函数。

人无远虑,必有近忧 477
上一篇: C++11 标准库创建线程 VS Windows 原生 API 创建线程
下一篇: C++中智能指针
buling-chen
博客等级 码龄6年 142粉丝 36原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值