广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++内联函数inline与auto关键字怎么使用
  • 559
分享到

C++内联函数inline与auto关键字怎么使用

2023-06-30 14:06:59 559人浏览 八月长安
摘要

这篇文章主要介绍“c++内联函数inline与auto关键字怎么使用”,在日常操作中,相信很多人在C++内联函数inline与auto关键字怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++内联函数

这篇文章主要介绍“c++内联函数inline与auto关键字怎么使用”,在日常操作中,相信很多人在C++内联函数inline与auto关键字怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++内联函数inline与auto关键字怎么使用”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

1.内敛函数

1.1问题引入

我们在使用C语言中我们都学过函数,我们知道函数在调用的过程中需要开辟栈帧。如果我们需要频繁的调用一个函数,假设我们调用10次Add()函数,那我们就需要建立10次栈帧。我们都知道在栈帧中要做很多事情,例如保存寄存器,压参数,压返回值等等,这个过程是很麻烦的。那在C语言中,我们可以通过宏来解决这个问题。在C++中,我们便引入了内敛函数(inline)。

1.2内联函数的概念

以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数压栈的开销,内联函数提升程序运行的效率。

我们这里依然使用Add()函数举例。这段代码是我们常写的Add()函数。假设我们多次调用Add函数,在C语言中,我们可以使用宏替换。在C++我们可以在函数前加上inline

int Add(int x, int y){int z = x + y;return z;}

C语言中用宏来代替Add函数:

#define Add(x,y) ((x)+(y))

C++中在函数前加上inline使之成为内联函数

inline int Add(int x, int y){int z = x + y;return z;}

那C语言已经有了宏替换,为什么C++还要出现内联函数呢?

主要是有两个原因:

宏晦涩难懂不好控制,特别容易写错.语法机制设计不好。

宏不支持调试,但是内敛在debug下支持调试(在debug下不会展开,在release下才会展开),这样我们对代码的理解和掌握将大大提高。

C++内联函数inline与auto关键字怎么使用

如果在Add函数前增加 inline 关键字将其改成内联函数,在编译期间编译器会用函数体替换函数的调用。 查看方式:

在 release 模式下,查看编译器生成的汇编代码中是否存在 call Add

在 debug 模式下,需要对编译器进行设置,否则不会展开 ( 因为 debug 模式下,编译器默认不会对代码进 行优化,以下给出 vs2019 的设置方式 )

C++内联函数inline与auto关键字怎么使用

C++内联函数inline与auto关键字怎么使用

C++内联函数inline与auto关键字怎么使用

C++内联函数inline与auto关键字怎么使用

1.3内敛函数的特性

inline 是一种 以空间换时间 的做法,省去调用函数额开销。所以 代码很长 或者有 循环 / 递归 的函数不适宜使用作为内联函数。

inline 对于编译器而言只是一个建议 ,编译器会自动优化,如果定义为 inline 的函数体内有循环 / 递归等等,编译器优化时会忽略掉内联。

inline 不建议声明和定义分离,分离会导致链接错误。因为 inline 被展开,就没有函数地址了,链接就会找不到

  • inline是一种以空间换时间的做法,省去调用函数额开销(建立栈帧).所以代码很长或者递归的函数不适宜用内联函数.

这里代码多长算长呢? 一般是10行左右,具体取决于编译器。

  • inline对于编译器而言只是一个建议,编译器会自动优化,如果定义为inline的函数体内有循环/递归等等,编译器优化时会忽略掉内联。

这里可以举个例子,假设我们有一个代码需要10行,但是我们需要调用1000次。如果inline替换的话,我们要有1000*10条指令,如果不替换则有1000+10条指令。因此最终是否替换,取决于编译器。

inline int Add(int x, int y){int z = x + y;z += x * y;z += x * y;z += x * y;z += x * y;z += x * y;z += x * y;z += x * y;z += x * y;z += x * y;z += x * y;z += x * y;return z;}

C++内联函数inline与auto关键字怎么使用

我们发现,虽然Add函数前加了inline,但是最终却没有展开。

  • inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址了,链接就会找不到

C++内联函数inline与auto关键字怎么使用

C++内联函数inline与auto关键字怎么使用

我们在f.cpp中调用一下:发现报错了

C++内联函数inline与auto关键字怎么使用

在这里他就会发生链接错误:

C++内联函数inline与auto关键字怎么使用

这是因为test.h中替换到test.cpp中发现是内联函数,内联函数不需要生成地址,因为内联函数调用的地方都展开了,因此不会存在在符号表中。外部调用时就找不到。因此不要将声明和定义分开。

2.auto关键字

2.1 auto简介

在早期 C/C++ 中 auto 的含义是:使用 auto 修饰的变量,是具有自动存储器的局部变量。C++11中,标准委员会赋予了auto 全新的含义即: auto 不再是一个存储类型指示符,而是作为一个新的类型 指示符来指示编译器, auto 声明的变量必须由编译器在编译时期推导而得

auto在C语言中我们是接触过的:最宽宏大量的关键字,由于局部变量默认都是auto修饰的,因此auto可以省略,这就导致auto常常被人忽略。那么在C++11中,auto进行了升级,有了新的功能--自动推导。(注意:auto新功能只是在C++11之后才有此功能)

C++内联函数inline与auto关键字怎么使用

那么auto是怎么自动推导呢?

我们可以使用typeid,来打印一个变量的类型。

int main(){    const int  a = 10;auto b = &a;auto c = 'a';cout << typeid(b).name() << endl;//typeid可以打印一个变量的类型cout << typeid(a).name() << endl;//typeid可以打印一个变量的类型cout << typeid(c).name() << endl;//typeid可以打印一个变量的类型return 0;}

C++内联函数inline与auto关键字怎么使用

我们发现auto的自动推导还是很智能的。

auto意义之一:类型很长时,懒得写,可以让他自动推导

注意:

使用 auto 定义变量时必须对其进行初始化,在编译阶段编译器需要根据初始化表达式来推导 auto 的实际类 型 。因此 auto 并非是一种 “ 类型 ” 的声明,而是一个类型声明时的 “ 占位符 ” ,编译器在编译期会将 auto 替换为 变量实际的类型 。

2.2 auto的使用细则

auto与指针和引用结合起来使用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型时则必须加&.

int main(){int x = 10;auto a = &x;auto& c = x;cout << typeid(x).name() << endl;//typeid可以打印一个变量的类型cout << typeid(a).name() << endl;//typeid可以打印一个变量的类型cout << typeid(c).name() << endl;//typeid可以打印一个变量的类型return 0;}

C++内联函数inline与auto关键字怎么使用

在同一行定义多个变量当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量。

auto a = 1, b = 2;auto c = 3, d = 4.0;//c和d类型不同,auto推导会冲突的

C++内联函数inline与auto关键字怎么使用

2.3 auto不能推导的场景

auto不能作为函数的参数

// 此处代码编译失败,auto不能作为形参类型,因为编译器无法对a的实际类型进行推导void TestAuto(auto a){}

C++内联函数inline与auto关键字怎么使用

auto不能直接用来声明数组

void TestAuto(){int a[] = { 1,2,3 };auto b[] = { 4,5,6 };}

C++内联函数inline与auto关键字怎么使用

2.4 auto与新式for循环使用

在平常我们打印一个array数组,我们需要依次打印遍历。如下代码所示:

int main(){int array[] = { 1,2,3,4,5 };for (int i = 0; i < sizeof(array) / sizeof(int); ++i)array[i] *= 2;for (int i = 0; i < sizeof(array) / sizeof(int); ++i)cout << array[i] << " ";cout << endl;return 0;}

C++内联函数inline与auto关键字怎么使用

我们也可以使用auto结合范围for循环打印这个数组:

for (auto e : array)cout << e << " ";cout << endl;

C++内联函数inline与auto关键字怎么使用

在这里我们使用到了一个新的for循环,范围for。它会依次自动取array中的数据,赋值给e,并且会自动判断结束,因此我们使用auto可以自动识别数组元素的类型。

注意:e只是array的拷贝,改变e不会改变array数组的内容。如果我们想改变array的内容,只需要加个引用即可,意思是让e成为array的别名,代码如下:

//加个引用就可以访问到arrayfor (auto& e : array){e /= 2;}for (auto e : array)cout << e << " ";

C++内联函数inline与auto关键字怎么使用

到此,关于“C++内联函数inline与auto关键字怎么使用”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: C++内联函数inline与auto关键字怎么使用

本文链接: https://www.lsjlt.com/news/329474.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++内联函数inline与auto关键字怎么使用
    这篇文章主要介绍“C++内联函数inline与auto关键字怎么使用”,在日常操作中,相信很多人在C++内联函数inline与auto关键字怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++内联函数...
    99+
    2023-06-30
  • C++深入探索内联函数inline与auto关键字的使用
    目录1.内敛函数1.1问题引入1.2内联函数的概念1.3内敛函数的特性2.auto关键字2.1 auto简介2.2 auto的使用细则2.3 auto不能推导的场景2.4 auto与...
    99+
    2022-11-13
  • C++类与对象深入之引用与内联函数与auto关键字及for循环详解
    目录一:引用1.1:概念1.2:引用特性1.3:常引用1.4:使用场景1.5:引用和指针的区别二:内联函数2.1:概念2.2:特性2.3:面试题三:auto关键字3.1:auto简介...
    99+
    2022-11-13
  • C++中引用、内联函数、auto关键字和范围for循环详解
    目录一、前言二、引用三、内联函数四、auto关键字五、范围for循环六、结语一、前言 大家好久不见,这篇文章带大家学习一下C++中的引用和内联函数 二、引用 引用变量是一个别名,也就...
    99+
    2023-02-10
    c++ auto关键字 c++中的内联函数 c++引用的作用是什么
  • C++中auto关键字怎么使用
    今天小编给大家分享一下C++中auto关键字怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。前提引入类型名,在绝大多数...
    99+
    2023-07-06
  • inline内联函数怎么在C++项目中使用
    本篇文章为大家展示了 inline内联函数怎么在C++项目中使用,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。指定内联函数的方法很简单,只需要在函数定义处增加 inline 关键字。请看下面的例子:...
    99+
    2023-06-06
  • C语言关键字auto register怎么使用
    这篇文章主要介绍“C语言关键字auto register怎么使用”,在日常操作中,相信很多人在C语言关键字auto register怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C...
    99+
    2023-06-26
  • C++引用与内联函数怎么使用
    这篇文章主要介绍“C++引用与内联函数怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C++引用与内联函数怎么使用”文章能帮助大家解决问题。一、引用首先我们来看一下引用的概念:1.1引用的概念...
    99+
    2023-07-05
  • C++的内联函数怎么使用
    本文小编为大家详细介绍“C++的内联函数怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++的内联函数怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、常量与宏回顾C++中的const常量可以替...
    99+
    2023-06-30
  • C++内联成员函数怎么使用
    本篇内容主要讲解“C++内联成员函数怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++内联成员函数怎么使用”吧!什么是内联函数:内联函数是C++的一个增强功能,可以减少程序的执行时间。...
    99+
    2023-06-22
  • C语言字符串函数与内存函数怎么用
    这篇“C语言字符串函数与内存函数怎么用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C语言字符串函数与内存函数怎么用”文章吧...
    99+
    2023-06-30
  • C++中怎么利用explicit关键字实现构造函数
    这篇文章给大家介绍C++中怎么利用explicit关键字实现构造函数,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。如果C++类的构造函数有一个参数,那么在编译的时候就会有一个缺省的转换操作:将该构造函数对应数据类型的数...
    99+
    2023-06-17
  • C语言字符串函数和内存函数怎么使用
    本文小编为大家详细介绍“C语言字符串函数和内存函数怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“C语言字符串函数和内存函数怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。字符串函数长度不受限制的字...
    99+
    2023-06-30
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作