C++实操之内联成员函数介绍

目录
  • 前言
  • 什么是内联函数:
  • 如何使一个函数成为内联:
  • 为什么使用内联:
    • 优点 :
    • 缺点 :
    • 关键点 :
  • 总结

前言

在C语言中,我们使用了宏函数,这是编译器用来减少执行时间的一种优化技术。那么问题来了,在C++中,有什么更好的方法来解决这个问题呢?我们引入了内联函数,这是编译器用来减少执行时间的一种优化技术。我们将讨论内联函数的 “what, why, when & how”。

什么是内联函数:

内联函数是C++的一个增强功能,可以减少程序的执行时间。函数可以通过指示编译器,使其成为内联函数,这样编译器就可以取代那些被调用的函数定义。编译器会在编译时替换内联函数的定义,而不是在运行时引用函数定义。

注意:这只是建议编译器将函数内联,如果函数很大(在可执行指令等方面),编译器可以忽略 "内联 "请求,将函数作为普通函数处理。

如何使一个函数成为内联:

要使任何函数成为内联函数,在其定义的开头使用关键字 "inline"。

例子:


第一种情况:

class A

{

public:

  inline int add(int a, int b)

  {

    return (a+b);

  }

};

第二种情况:

class A

{

public:

  int add(int a, int b);

};

inline int A::add(int a, int b)

{

  return (a+b);

}

第三种情况:

inline int add_two (int a, int b)

{

  return (a+b);

}

你可以在它的类定义中定义一个成员函数,或者如果你已经在类定义中声明了(但没有定义)该成员函数,你可以在外面定义它。

第一种情况:

当在类成员列表中定义的成员函数默认为内联成员函数,所以第一个class A定义里,也可以省略inline关键字。

一般含有几行代码的成员函数通常被内联声明,或者说可以在类的定义中定义较短的函数。

第二种情况:

如果你在类定义之外定义一个成员函数,它必须出现在包围类定义的命名空间范围内。你还必须使用范围解析(::)操作符来限定成员函数的名称。

这时如果要声明为内联函数,可以类中用inline关键字声明它(并在其类之外定义该函数),或者在类的声明之外用inline关键字定义它。

上面第二个class A是在定义处使用inline关键字。

第三种情况:

普通的全局函数,可以在声明或定义处添加inline关键字。

在下面的例子中,成员函数Y::f()是一个内联成员函数:

链接属性:

内联修饰符不影响成员或非成员函数的链接属性:链接默认为外部链接。

内部链接表示只在当前文件内可访问,外部链接表示多个文件可访问。

局部类的成员函数必须在其类定义中定义。因此,局部类的成员函数是隐含的内联函数。这些内联成员函数没有链接属性。

为什么使用内联:

在许多地方,我们为小的工作/功能创建函数,其中包含简单和较少数量的可执行指令。想象一下它们每次被调用者调用时的开销。

当遇到正常的函数调用指令时,程序会存储紧随函数调用语句之后的指令的内存地址,将被调用的函数加载到内存中,复制参数值,跳转到被调用函数的内存位置,执行函数代码,存储函数的返回值,然后跳回执行被调用函数前刚刚保存的指令地址。运行时间开销太大。

C++的内联函数提供了一个替代方案。使用inline关键字,编译器用函数代码本身替换函数调用语句,然后编译整个代码(此过程成为代码展开)。因此,使用内联函数,编译器不必跳到另一个位置来执行函数,然后再跳回来,因为被调用函数的代码已经提供给调用程序。

通过下面的优点、缺点和性能分析,你将能够理解为什么使用“inline”关键字。

优点 :

1. 它避免了函数调用的开销,从而加快了程序执行。

2. 当函数调用发生时,它节省了在堆栈上push/pop变量的开销。

3. 它节省了从一个函数中返回调用处的开销。

4. 它通过利用指令缓存来更多使用本地引用。

5. 通过将其标记为内联,你可以将函数定义放在头文件中(也就是说,它可以包含在多个编译单元中,而不会被链接器抱怨)。

缺点 :

1. 由于代码展开,增加了最终可执行文件的大小。

2. C++的内联是在编译时处理的。这意味着如果你改变了内联函数的代码,你将需要重新编译所有使用它的代码,以确保它被更新。

3.  当在头文件中使用时,它使你的头文件变得更大,因为用户并不关心这些信息。

4.  如上所述,它增加了可执行文件的大小,这可能会导致内存的抖动。更多的页面故障会降低你的程序性能。

5. 有时并不实用,例如在嵌入式系统中,由于存储空间的限制,要保证尽可能小的可执行文件。

关键点 :

1. 内联函数只是一个建议,而不是强制性的。编译器可能会也可能不会内联你标记为内联的函数。没有标记为内联的函数,在编译或连接时,也可能被设置为内联。

2. 内联的工作方式就像编译器控制的复制/粘贴,这与预处理器的宏完全不同。宏会被强行内联,会污染所有的命名空间和代码,不容易调试。

3. 所有在类中声明并定义的成员函数默认是内联的。所以不需要明确定义为内联。

4. 虚函数不支持内联。但是,有时候,当编译器可以确定对象的类型时(即对象是在同一个函数体中声明和构造的),即使是一个虚拟函数也会被内联,因为编译器确切地知道对象的类型。

5. 模板方法/函数并不总是被内联的(它们在头文件中的存在不会使它们自动内联)。

6. 大多数编译器会对递归函数进行内联,有些编译器有此功能的开关,并可以设置最大的递归深度。

总结

到此这篇关于C++实操之内联成员函数介绍的文章就介绍到这了,更多相关C++内联成员函数内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++ inline内联函数详解

    函数是一个可以重复使用的代码块,CPU 会一条一条地挨着执行其中的代码.CPU 在执行主调函数代码时如果遇到了被调函数,主调函数就会暂停,CPU 转而执行被调函数的代码:被调函数执行完毕后再返回到主调函数,主调函数根据刚才的状态继续往下执行. 一个 C/C++ 程序的执行过程可以认为是多个函数之间的相互调用过程,它们形成了一个或简单或复杂的调用链条,这个链条的起点是 main(),终点也是 main().当 main() 调用完了所有的函数,它会返回一个值(例如return 0;)来结束自己的生

  • 详解C++中的内联函数和函数重载

    内联函数(内嵌函数,内置函数) 调用函数时需要一定的时间和空间的开销.C++提供一种提高效率的方法,即在编译时将函数调用处用函数体替换,类似于C语言中的宏展开.这种在函数调用处直接嵌入函数体的函数称为内联函数(inline function),又称内嵌函数或内嵌函数. 指定内联函数的方法很简单,只需要在定义函数时增加 inline 关键字. 注意:是在函数定义时增加 inline 关键字,而不是在函数声明时.在函数声明时增加 inline 关键虽然没有错误,但是也没有任何效果 inline 关键

  • C++ 内联函数详解

    目录 一.C++ 内联函数 1.内联 2.语法 3.评价 总结 一.C++ 内联函数 1.内联 C 语言中有宏函数的概念.宏函数的特点是内嵌到调用代码中去,避免了函数调用的开销.但是由于宏函数的处理发生在预处理阶段,缺失了语法检测和有可能带来的语意差错. 2.语法 C++提供了 inline 关键字,实现了真正的内嵌. 宏函数 VS inline函数 #include <iostream> #include <string.h> using namespace std; //优点:

  • c++内联函数(inline)使用详解

    介绍内联函数之前,有必要介绍一下预处理宏.内联函数的功能和预处理宏的功能相似.相信大家都用过预处理宏,我们会经常定义一些宏,如 复制代码 代码如下: #define TABLE_COMP(x) ((x)>0?(x):0) 就定义了一个宏. 为什么要使用宏呢?因为函数的调用必须要将程序执行的顺序转移到函数所存放在内存中的某个地址,将函数的程序内容执行完后,再返回到转去执行该函数前的地方.这种转移操作要求在转去执行前要保存现场并记忆执行的地址,转回后要恢复现场,并按原来保存地址继续执行.因此,函数调

  • C++内联函数详情

    内联函数是C++当中为了提高程序运行效率的设计,老实讲我没有在其他语言当中看到类似的设计.它和常规函数之间的主要区别不在于编写的方式,而是在于C++编译器会将内联函数组合到程序当中执行. 要解释这个过程会稍稍有些复杂,我们需要从编译的过程说起.对于编译型语言而言,编译器做的事情是把人类写出来人能读懂的代码翻译成机器能够识别.执行的机器语言,一般是一串十六进制的指令.随后计算机逐步执行这些指令,完成我们想要的功能. 当我们调用函数时,其实本质上是指令跳转,先记录下当前运行的指令位置,跳转到函数所在

  • C++实操之内联成员函数介绍

    目录 前言 什么是内联函数: 如何使一个函数成为内联: 为什么使用内联: 优点 : 缺点 : 关键点 : 总结 前言 在C语言中,我们使用了宏函数,这是编译器用来减少执行时间的一种优化技术.那么问题来了,在C++中,有什么更好的方法来解决这个问题呢?我们引入了内联函数,这是编译器用来减少执行时间的一种优化技术.我们将讨论内联函数的 "what, why, when & how". 什么是内联函数: 内联函数是C++的一个增强功能,可以减少程序的执行时间.函数可以通过指示编译器,

  • python函数超时自动退出的实操方法

    本章给大家在项目使用时候,常见的一种情况解决案例,即是当我们调用多个线程,使用了同一个函数去处理数据的时候,有些用函数已经处理完成,但是有些还没有,这就需要我们将任务进行分割,然后当一小部分任务执行后,退出来,另外没有执行的完成超时的就继续去执行,下面就针对遇到这些问题的小伙伴,给大家提供解决参考. 安装timeout-decorator库: pip3 install timeout-decorator 编写异常语句: @timeout_decorator.timeout(5, timeout_

  • linux编辑文件保存退出的实操讲解

    linux编辑文件后如何保存退出? 命令是wq 保存并退出. 首先按ESC进入Command模式,然后输入":wq",回车就可以保存并退出了. vi保存文件有不同的选项,对应于不同的命令,你可以从下面的命令中选择一个需要的输入: 1.wq 保存文件并退出vi 2.w 保存文件但不退出vi 3.w file 将修改另外保存到file中,不退出vi 4.q 不保存文件,退出vi 最后回车即可. 扩展资料 退出Vi 当编辑完文件准备退出Vi返回到shell时可以使用以下几种方法之一 在命令模

  • SQL SERVER 开启CDC 实操详细

    目录 1. 环境检查 1.1 版本检查 1.2 检查CDC服务开启状态 2. 开启CDC 2.1 开启SQL server agent服务 2.2 开启数据库级别的CDC功能 2.3 添加CDC专用的文件组和文件 2.4 开启表级别CDC 2.5 单表开启测试范例(仅供参考,可略过) 2.6 开启成功说明 2.7 DDL操作:DDL操作需要重新收集表的信息(以测试表test_hht为例) 3. 关闭CDC 1. 环境检查 1.1 版本检查 SELECT @@VERSION; Microsoft

  • MySQL学习之基础命令实操总结

    目录 启动mysql服务 连接mysql 常用命令 Database Table 启动mysql服务 (以管理员身份运行cmd) net start mysql 连接mysql mysql -u root -p 常用命令 Database 查看库 show databases; 创建库 create database database_name; 使用库 use database_name; 查看当前使用库 select database(); Table 创建表 create table ta

  • Spring整合Mybatis实操分享

    目录 Mybatis的基本工作原理 分析需要解决的问题 Spring中Bean的产生过程 解决问题 总结 在介绍Spring整合Mybatis原理之前,我们得先来稍微介绍Mybatis的工作原理. Mybatis的基本工作原理 在Mybatis中,我们可以使用一个接口去定义要执行sql,简化代码如下: 定义一个接口,@Select表示要执行查询sql语句. public interface UserMapper { @Select("select * from user where id = #

  • C++入门教程之内联函数与extern "C"详解

    目录 一.   内联函数 1.概念及分析 2.特性 3.宏 二.   extern “C” 1.C++程序 2.C程序 总结 一.   内联函数 1.概念及分析 以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率. int Add(int a, int b) { int c = a + b; return c; } int main() { int ret= Add(1, 2); return 0; } 在我

  • C++中类的成员函数及内联函数使用及说明

    目录 成员函数 成员函数中出现的参数 类相关的非成员函数 自己定义的对象作为函数的形参 成员函数返回值是对象的引用 成员函数调用成员函数 内联函数 成员函数 即在类内定义的方法.通过对象名.成员函数()的方式可以调用. 一般将成员函数定义在类外,因为成员函数一般比较复杂. 简单的成员函数可以定义在类内,定义在类外的方式如下所示: 成员函数中出现的参数 对于成员函数中出现的参数,首先先在成员函数内部查找其声明,如在成员函数内没找到,则在类内寻找,类内所有权限的成员都可以被考虑,即使声明部分出现在函

  • Python中Qslider控件实操详解

    在学习一些pyqt5的内容后,我们对于其中的组件也有所接触.本篇所要带来的是Qslider控件,也可以说是python中比较常见的控件了.在一些具体的使用和方向等相关的操作上,很多人是没有全面的进行过系统学习的.下面我们就这些操作逐个为大家带来介绍,一起来看下Qslider控件的使用吧. 1.控件介绍和使用 qslider解释为滑块控件,用于方便左右滑动. 往往这类滑动更多用于屏幕可以触碰的设备. 我们想要使用滑块控件,本质上实则就是调用Qslider类. 使用的时候,首先对qslider这个类

  • 实操Python爬取觅知网素材图片示例

    目录 [一.项目背景] [二.项目目标] [三.涉及的库和网站] [四.项目分析] [五.项目实施] [六.效果展示] [七.总结] [一.项目背景]    在素材网想找到合适图片需要一页一页往下翻,现在学会python就可以用程序把所有图片保存下来,慢慢挑选合适的图片. [二.项目目标] 1.根据给定的网址获取网页源代码. 2.利用正则表达式把源代码中的图片地址过滤出来. 3.过滤出来的图片地址下载素材图片. [三.涉及的库和网站] 1.网址如下: https://www.51miz.com/

随机推荐