0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C++基础语法之inline 内联函数

C语言编程学习基地 来源:C语言编程学习基地 作者:C语言编程 2021-09-09 09:38 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

上节我们分析了C++基础语法的const,static以及 this 指针,那么这节内容我们来看一下 inline 内联函数吧!

inline 内联函数

特征

相当于把内联函数里面的内容写在调用内联函数处;

相当于不用执行进入函数的步骤,直接执行函数体;

相当于宏,却比宏多了类型检查,真正具有函数特性;

编译器一般不内联包含循环、递归、switch 等复杂操作的内联函数;

在类声明中定义的函数,除了虚函数的其他函数都会自动隐式地当成内联函数。

inline 使用

// 声明1(加 inline,建议使用)inline int functionName(int first, int second,。。。);

// 声明2(不加 inline)int functionName(int first, int second,。。。);

// 定义inline int functionName(int first, int second,。。。) {/****/};

// 类内定义,隐式内联class A { int doA() { return 0; } // 隐式内联}

// 类外定义,需要显式内联class A { int doA();}inline int A::doA() { return 0; } // 需要显式内联

编译器对 inline 函数的处理步骤

将 inline 函数体复制到 inline 函数调用点处;

为所用 inline 函数中的局部变量分配内存空间;

将 inline 函数的的输入参数和返回值映射到调用方法的局部变量空间中;

如果 inline 函数有多个返回点,将其转变为 inline 函数代码块末尾的分支(使用 GOTO)。

优缺点

优点

内联函数同宏函数一样将在被调用处进行代码展开,省去了参数压栈、栈帧开辟与回收,结果返回等,从而提高程序运行速度。

内联函数相比宏函数来说,在代码展开时,会做安全检查或自动类型转换(同普通函数),而宏定义则不会。

在类中声明同时定义的成员函数,自动转化为内联函数,因此内联函数可以访问类的成员变量,宏定义则不能。

内联函数在运行时可调试,而宏定义不可以。

缺点

代码膨胀。内联是以代码膨胀(复制)为代价,消除函数调用带来的开销。如果执行函数体内代码的时间,相比于函数调用的开销较大,那么效率的收获会很少。另一方面,每一处内联函数的调用都要复制代码,将使程序的总代码量增大,消耗更多的内存空间。

inline 函数无法随着函数库升级而升级。inline函数的改变需要重新编译,不像 non-inline 可以直接链接。

是否内联,程序员不可控。内联函数只是对编译器的建议,是否对函数内联,决定权在于编译器。

虚函数(virtual)可以是内联函数(inline)吗?

虚函数可以是内联函数,内联是可以修饰虚函数的,但是当虚函数表现多态性的时候不能内联。

内联是在编译器建议编译器内联,而虚函数的多态性在运行期,编译器无法知道运行期调用哪个代码,因此虚函数表现为多态性时(运行期)不可以内联。

inline virtual 唯一可以内联的时候是:编译器知道所调用的对象是哪个类(如 Base::who()),这只有在编译器具有实际对象而不是对象的指针或引用时才会发生。

虚函数内联使用

#include 《iostream》 using namespace std;class Base{public: inline virtual void who(){ cout 《《 “I am Base

”; } virtual ~Base() {}};class Derived : public Base{public: inline void who() // 不写inline时隐式内联{ cout 《《 “I am Derived

”; }};

int main(){ // 此处的虚函数 who(),是通过类(Base)的具体对象(b)来调用的,编译期间就能确定了,所以它可以是内联的,但最终是否内联取决于编译器。 Base b; b.who();

// 此处的虚函数是通过指针调用的,呈现多态性,需要在运行时期间才能确定,所以不能为内联。 Base *ptr = new Derived(); ptr-》who();

// 因为Base有虚析构函数(virtual ~Base() {}),所以 delete 时,会先调用派生类(Derived)析构函数,再调用基类(Base)析构函数,防止内存泄漏。 delete ptr; ptr = nullptr;

system(“pause”); return 0;}

那么今天的分享就到这里了,希望对大家有帮助~喜欢的话可以支持一下哟!

写在最后:对于准备学习C/C++编程的小伙伴,如果你想更好的提升你的编程核心能力(内功)不妨从现在开始!

编辑:jq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Switch
    +关注

    关注

    1

    文章

    541

    浏览量

    61359
  • 函数
    +关注

    关注

    3

    文章

    4406

    浏览量

    66851
  • C++
    C++
    +关注

    关注

    22

    文章

    2122

    浏览量

    76714
  • 编译器
    +关注

    关注

    1

    文章

    1669

    浏览量

    51083
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    C++程序异常的处理机制

    运行代码进行分离,使得程序更加模块化;另一方面,C++的异常处理可以不需要异常处理在异常发生时的同一个函数,而是可以在更上层合适的位置进行处理。 下面,我们一起来看看C++的异常处理。 2、异常处理
    发表于 12-02 07:12

    inline ASM(内联汇编)的细节分享

    内联汇编,否则,仍然是带有C++表达式的内联江编,此时\"instructionlist\"中的寄存器的写法需要遵守相关的规定: 寄存器前必须使用两个百分号(%%),而不是像
    发表于 10-31 09:11

    简单的内联汇编介绍

    前言1、在程序中我们可以嵌入汇编直接对我们加入的硬件进行相应的操作 2、在RISC-V架构中定义的CSR寄存器需要使用特殊的 CSR 指令进行访问,如果在 C/C++程序中需要使用 CSR 寄存器
    发表于 10-30 08:04

    RISC-V的工具链GCC内联汇编

    具体实现方法和步骤 在RISC-V架构中定义的CSR寄存器需要使用特殊的CSR指令进行访问,如果CC++程序中需要访问CSR寄存器,只能使用内嵌汇编指令的方法。在CC++程序中嵌入
    发表于 10-30 06:59

    GCC内联汇编

    需要用到C/C++中的内联汇编语法asm volatile(“instructions”) 以在C代码中嵌入汇编以执行自定义指令集。 __S
    发表于 10-24 07:46

    通过内联汇编调用乘法指令mulh\\mulhsu\\mulhu

    mulh、mulhu与mulhsu指令,不能直接验证,需要其他方法。因此,我们想到了在C语言中嵌入内联汇编,分别生成三条指令的接口函数,之后便只需在C语言中调用者三中
    发表于 10-24 06:52

    强实时运动控制内核MotionRT750(六):us级高速交互C++,为智能装备提速

    Windows下运动控制实时内核MotionRT750的高速交互C++
    的头像 发表于 09-04 14:50 492次阅读
    强实时运动控制内核MotionRT750(六):us级高速交互<b class='flag-5'>之</b><b class='flag-5'>C++</b>,为智能装备提速

    将TLE9140 DeviceDriver移植到TLE9893时出现未知类型名称“INLINE”,如何解决?

    ): 警告:在包含的文件中... ./RTE/Device/TLE9893_2QKW62Scmsis_misra.h(78): 错误:未知类型名称“INLINE” 78 | 内联 sint32 CMSIS_Irq_Dis(void); 我使用的环境是: 如何修复这个错误
    发表于 07-28 07:31

    C语言中的内联函数与宏

    C编程中,内联函数和宏都用于避免函数调用的开销并编写可复用的逻辑部分,但它们在工作方式和安全性方面存在显著差异。
    的头像 发表于 07-25 15:10 1724次阅读
    <b class='flag-5'>C</b>语言中的<b class='flag-5'>内联</b><b class='flag-5'>函数</b>与宏

    基于LockAI视觉识别模块:C++目标检测

    本文档基于瑞芯微RV1106的LockAI凌智视觉识别模块,通过C++语言做的目标检测实验。本文档展示了如何使用lockzhiner_vision_module::PaddleDet类进行目标检测,并通过lockzhiner_vision_module::Visualize函数
    的头像 发表于 06-06 13:56 609次阅读
    基于LockAI视觉识别模块:<b class='flag-5'>C++</b>目标检测

    MSP430常用内联函数说明

    电子发烧友网站提供《MSP430常用内联函数说明.docx》资料免费下载
    发表于 06-05 17:20 0次下载

    主流的 MCU 开发语言为什么是 C 而不是 C++

    在单片机的地界儿里,C语言稳坐中军帐,C++想分杯羹?难喽。咱电子工程师天天跟那针尖大的内存空间较劲,C++那些花里胡哨的玩意儿,在这儿真玩不转。先说内存这道坎儿。您当stm32f4的256kRAM
    的头像 发表于 05-21 10:33 782次阅读
    主流的 MCU 开发语言为什么是 <b class='flag-5'>C</b> 而不是 <b class='flag-5'>C++</b>?

    Spire.XLS for C++组件说明

    Spire.XLS for C++ 是一款专业的 C++ Excel 组件,可以用在各种 C++ 框架和应用程序中。Spire.XLS for C++ 提供了一个对象模型 Excel
    的头像 发表于 01-14 09:40 1301次阅读
    Spire.XLS for <b class='flag-5'>C++</b>组件说明

    AKI跨语言调用库神助攻C/C++代码迁移至HarmonyOS NEXT

    /C++代码快速迁移至HarmonyOS NEXT。凭借卓越的兼容性,AKI已成为厂商与开发者打造鸿蒙原生应用过程中广泛使用的跨语言调用解决方案。 AKI是一款专为鸿蒙原生开发设计的FFI(外部函数接口
    发表于 01-02 17:08

    运动控制卡周期上报实时数据IO状态C++

    使用C++进行运动控制卡的周期上报功能实现
    的头像 发表于 12-17 13:59 1534次阅读
    运动控制卡周期上报实时数据IO状态<b class='flag-5'>之</b><b class='flag-5'>C++</b>篇