1 C++基础语法之inline 内联函数-德赢Vwin官网 网
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

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

    关注

    1

    文章

    533

    浏览量

    58219
  • 函数
    +关注

    关注

    3

    文章

    4327

    浏览量

    62568
  • C++
    C++
    +关注

    关注

    22

    文章

    2108

    浏览量

    73617
  • 编译器
    +关注

    关注

    1

    文章

    1623

    浏览量

    49107
收藏 人收藏

    评论

    相关推荐

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

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

    同样是函数,在CC++中有什么区别

    同样是函数,在 CC++ 中有什么区别? 第一个返回值。 C语言的函数可以不写返回值类型,编译器会默认为返回 int。 但是
    的头像 发表于 11-29 10:25 264次阅读

    C++新手容易犯的十个编程错误

    简单的总结一下 C++ 新手容易犯的一些编程错误,给新人们提供一个参考。 1 有些关键字在 cpp 文件中多写了 对于 C++ 类,一些关键字只要写在 .h 中就好,cpp 中就不用再加上了,比如
    的头像 发表于 11-15 12:42 308次阅读

    C7000优化C/C++编译器

    德赢Vwin官网 网站提供《C7000优化C/C++编译器.pdf》资料免费下载
    发表于 10-30 09:45 0次下载
    <b class='flag-5'>C</b>7000优化<b class='flag-5'>C</b>/<b class='flag-5'>C++</b>编译器

    C++语言基础知识

    德赢Vwin官网 网站提供《C++语言基础知识.pdf》资料免费下载
    发表于 07-19 10:58 7次下载

    C++中实现类似instanceof的方法

    函数,可实际上C++中没有。但是别着急,其实C++中有两种简单的方法可以实现类似Java中的instanceof的功能。 在 C++ 中,确定对象的类型是编程中实际需求,使开发人员
    的头像 发表于 07-18 10:16 572次阅读
    <b class='flag-5'>C++</b>中实现类似instanceof的方法

    inline关键字被优化导致此类函数被布局在flash内,怎么处理?

    == 0));} 由于uart.c多处调用这个函数,所以编译器自作聪明地把它编译成了非内联函数(意图是减少代码占用?),且elf能找到uart_ll_is_tx_idle标号
    发表于 06-21 12:03

    IDF4.2.1的编译器优化bug导致panic怎么处理?

    == 0) && (status.st_utx_out == 0));} 它是一个inline函数。我们都认为inline关键字,会告诉编译器内联
    发表于 06-21 10:55

    FX2 CY7C68013A如何在C++环境中使用LoadEEPROM函数

    我使用的是 FX2 CY7C68013A 芯片。 我知道 CyUSB.NET 库中有我需要的 LoadEEPROM 函数。 请问如何在 C++ 环境而不是 C#/CLR 环境中使用该
    发表于 05-31 06:59

    使用 MISRA C++:2023® 避免基于范围的 for 循环中的错误

    在前两篇博客中,我们 向您介绍了新的 MISRA C++ 标准 和 C++ 的历史 。在这篇博客中,我们将仔细研究以 C++ 中 for 循环为中心的特定规则。
    的头像 发表于 03-28 13:53 782次阅读
    使用 MISRA <b class='flag-5'>C++</b>:2023® 避免基于范围的 for 循环中的错误

    内联函数定义 为什么需要内联函数

    inline关键字是C99标准的型关键字,其作用是将函数展开,把函数的代码复制到每一个调用处。
    的头像 发表于 02-19 12:20 540次阅读

    c语言,c++,java,python区别

    操作系统、嵌入式系统等对性能要求较高的场景。C语言的语法相对简单,学习曲线较平缓,也是学习其他高级语言的入门语言。 C++C++是在C
    的头像 发表于 02-05 14:11 2359次阅读

    vb语言和c++语言的区别

    Microsoft开发的一种面向对象的事件驱动编程语言。它的设计目标是简化编程过程,让初学者也能快速上手。与相比,C++语言是一种通用的、面向对象的编程语言,其设计目标是提供高性能的系统级编程。 语法: VB语言的
    的头像 发表于 02-01 10:20 2252次阅读

    C++简史:C++是如何开始的

    MISRA C++:2023,MISRA® C++ 标准的下一个版本,来了!为了帮助您做好准备,我们介绍了 Perforce 首席技术支持工程师 Frank van den Beuken 博士撰写
    的头像 发表于 01-11 09:00 577次阅读
    <b class='flag-5'>C++</b>简史:<b class='flag-5'>C++</b>是如何开始的

    基于C/C++面向对象的方式封装socket通信类

    在掌握了基于 TCP 的套接字通信流程之后,为了方便使用,提高编码效率,可以对通信操作进行封装,本着有浅入深的原则,先基于 C 语言进行面向过程的函数封装,然后再基于 C++ 进行面向对象的类封装。
    的头像 发表于 12-26 09:57 1332次阅读