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

    文章

    514

    浏览量

    57506
  • 函数
    +关注

    关注

    3

    文章

    3859

    浏览量

    61297
  • C++
    C++
    +关注

    关注

    21

    文章

    2066

    浏览量

    72880
  • 编译器
    +关注

    关注

    1

    文章

    1573

    浏览量

    48604
收藏 人收藏

    评论

    相关推荐

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

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

    什么是C++函数? 应该怎么定义? 用途是什么?

    什么是C++函数? 应该怎么定义? 主要用途是什么?
    发表于 11-08 06:58

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

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

    171从ADS迁移到RVDS 3.0的应用笔记

    并不是一个要求。 某些ARM工具特定功能已更改或已过时,需要更改这些功能。 内联汇编程序(__ASM)C编译器有一个内置的内联汇编程序。 然而,ARM体系结构6和更高版本的指令集不会保持这一点。 建议用户将所有
    发表于 08-30 08:17

    C++生成Dll与回调函数测试

    描述了VS环境下,通过C++生成dll的方法,测试回调函数
    的头像 发表于 08-29 16:05 632次阅读
    <b class='flag-5'>C++</b>生成Dll与回调<b class='flag-5'>函数</b>测试

    ARM编译器v5.06 forµVision ARM ASM用户指南

    ARM编译器工具链提供了不同的汇编器。 它们是: ·一台独立的装配机,双臂。 ·CC++编译器中内置的优化内联汇编程序和非优化嵌入式汇编程序。 它们对汇编指令使用相同的语法
    发表于 08-12 06:56

    【开源三方库】Aki:一行代码极简体验JS&amp;C++跨语言交互

    :同步异步接口封装 示例一期望将C++业务逻辑(GetName)注册为JS同步接口(getSync)、异步接口(getAsync),Aki提供了极简的JSBind函数绑定语法糖,一行代码绑定跨语言调用接口
    发表于 08-07 17:04

    使用C++ sort函数对vector进行自定义排序

    今天在学一些C++ STL容器,看到sort函数允许自定义排序规则,小小地实操了一下。
    的头像 发表于 07-22 10:12 1032次阅读

    C++ std::tie函数的作用和用法

    C++中std::tie函数的作用就是从元素引用中生成一个tuple元组,其在头文件中定义
    的头像 发表于 07-18 17:28 554次阅读

    函数指针的基本概念和语法

    函数指针是一种非常强大的编程工具,它可以让我们以更加灵活的方式编写程序。在本文中,我们将介绍 6 个函数指针的高级应用场景,并贴出相应的代码案例和解
    的头像 发表于 07-05 10:32 392次阅读

    嵌入式-C++函数的重载

    一、什么是函数的重载 两个以上的函数,具有相同的函数名,通过参数的类型和参数的个数不同。编译器自行匹配,自动确定调用哪一个函数 二、函数重载
    发表于 06-28 13:54

    ESP8266 HTML工作正常,不能内联CSS是为什么?

    内联 CSS 的示例: “This is a red heading with a black background\" 我无法让 C++ IDE 像这样解释该行是。有解决办法吗?
    发表于 06-12 08:07

    如何为xtensa编译C++

    我想为 xtensa 编译简单的 C++ 代码,但我不能。 代码:全选#include \"ets_sys.h\" #include \"osapi.h\"
    发表于 06-09 07:02

    c++常见函数

    c++常见函数集包括:线性代数方程组的解法、插值、数值积分、特殊函数函数逼近、随机数排序、特征值问题、数据拟合、方程求根和非线性方程组的解法、函数
    发表于 05-09 14:52 1次下载

    在Rust中使用内联汇编

    与 GCC 内联汇编语法一样,Rust 希望即使需要手写汇编,程序员也能将一部分工作交给编译器来高效完成,这部分工作就是寄存器分配,毕竟只有编译器了解内联汇编前后的上下文,知道该怎么分配寄存器最合适。
    的头像 发表于 05-04 09:54 560次阅读