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

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

3天内不再提示

C++语法中的inline内联函数详解

C语言编程学习基地 来源:C语言编程学习基地 作者:C语言编程 2021-09-09 09:33 次阅读

上节我们分析了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;}

责任编辑:haq

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

    关注

    3

    文章

    3866

    浏览量

    61308
  • C++
    C++
    +关注

    关注

    21

    文章

    2066

    浏览量

    72899

原文标题:C++基础语法梳理:inline 内联函数!

文章出处:【微信号:cyuyanxuexi,微信公众号:C语言编程学习基地】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    RealView MDK中使用内联函数时需要注意的问题

    的文件申明为extern类型。原因是MDK中使用的__inline函数时和标准C++inline
    发表于 08-02 10:10

    C++标准编程:虚函数内联

      曾经在讨论C++的时候,经常会问到:“虚函数能被声明为内联吗?”现在,我们几乎听不到这个问题了。现在听到的是:“你不应该使print成为内联的。声明一个虚
    发表于 05-03 11:53

    关于内联函数inline的问题

    内联函数我写了一个for循环,为什么我更改循环次数并未导致代码量的增加?Code始终是2396
    发表于 07-06 13:53

    内联函数简介

    1.内联函数C++我们通常定义以下函数来求两个整数的最大值:复制代码 代码如下:int max(int a, int b){return
    发表于 09-11 16:22

    IAR开发环境默认是不支持inline的吗?

    help文件里的解释是说:C++ inline semantics, enables C++ inline semantics when compiling a Standard
    发表于 09-05 04:35

    如何使用内联函数法调用汇编函数

    C/C++调用汇编代码函数使用内联函数法调用
    发表于 04-02 06:57

    C++如何处理内联函数

    当一个函数内联和虚函数时,会发生代码替换或使用虚表调用吗? 为了弄 清楚内联和虚函数,让我们将它们分开来考虑。通常,一个
    发表于 11-29 11:59 28次下载

    内联函数详解

    什么是内联性和外联函数 类的成员函数可以分为内联函数和外联函数
    发表于 11-02 14:05 0次下载

    内联函数和外联函数有什么区别

    内联函数是指用inline关键字修饰的函数。在类内定义的函数被默认成内联
    发表于 12-15 11:52 5475次阅读
    <b class='flag-5'>内联</b><b class='flag-5'>函数</b>和外联<b class='flag-5'>函数</b>有什么区别

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

    上节我们分析了C++基础语法的const,static以及 this 指针,那么这节内容我们来看一下 inline 内联函数吧!
    的头像 发表于 09-09 09:38 1851次阅读

    讲解下C语言的内联函数

    内联函数是C语言从C++中借鉴过来的,适当的使用内联函数可以提高程序的执行效率。
    的头像 发表于 02-16 09:15 1028次阅读

    C语言内联函数,提升C技巧必备

    内联函数是C语言从C++中借鉴过来的,适当的使用内联函数可以提高程序的执行效率。本篇文章就来讲解下内联
    的头像 发表于 02-16 09:16 574次阅读

    C语言内联函数

    函数B很小,又被频繁的调用,可能函数调用的切换时间比函数内代码的执行时间还长,这样明显划不来,那么我们就可以将这个函数声明为内联(加上
    的头像 发表于 02-21 16:55 623次阅读
    C语言<b class='flag-5'>内联</b><b class='flag-5'>函数</b>

    C++基础知识之函数2

    C++中,我们可以使用inline关键字来定义内联函数内联函数是一种特殊的
    的头像 发表于 04-03 10:34 349次阅读

    宏的缺陷与内联函数的引入

    。 所以为了解决这种不利于调试的问题,就有了内联函数。 那么什么是内联函数呢? 我们以inline修饰的
    的头像 发表于 11-01 17:57 230次阅读