当前位置: 首页 > article >正文

【C++】内联函数inline、关键字auto与新式for

内联函数

内联函数背景

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

内联函数概念

以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++还要出现内联函数呢?

主要是有两个原因:
1.宏晦涩难懂不好控制,特别容易写错.语法机制设计不好。
2.宏不支持调试,但是内敛在debug下支持调试(在debug下不会展开,在release下才会展开),这样我们对代码的理解和掌握将大大提高。

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

  1. 在 release 模式下,查看编译器生成的汇编代码中是否存在 call Add
  2. 在 debug 模式下,需要对编译器进行设置,否则不会展开
    在这里插入图片描述
    在这里插入图片描述

内联函数特性

inline是一种以空间换时间的做法,省去调用函数额开销(建立栈帧).所以代码很长或者递归的函数不适宜用内联函数.
这里代码多长算长呢? 一般是10行左右,具体取决于编译器。

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

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

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

auto

什么是auto

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

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

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;
}

在这里插入图片描述

auto不能使用的场景

auto不能作为函数的参数
auto不能直接用来声明数组

auto与新式for

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

在这里插入图片描述


http://www.kler.cn/a/525463.html

相关文章:

  • 数字化转型-工具变量(2024.1更新)-社科数据
  • C++并发编程指南02
  • 动手学图神经网络(8):在消息传递中定制聚合操作
  • 什么是 AI 代理?
  • redis中n是什么含义?
  • 从春晚《秧BOT》来看人形机器人与四足机器人的区别
  • IPhone13 Pro Max设备详情
  • 寒假学web--day06
  • arkui-x跨平台与android java联合开发
  • 解读隐私保护工具 Fluidkey:如何畅游链上世界而不暴露地址?
  • 微服务学习-服务调用组件 OpenFeign 实战
  • 四.4 Redis 五大数据类型/结构的详细说明/详细使用( zset 有序集合数据类型详解和使用)
  • Tez 0.10.1安装
  • Rust语言进阶之zip用法实例(九十五)
  • 简化配置与动态表达式的 Spring EL
  • 【硬件介绍】三极管工作原理(图文+典型电路设计)
  • 守护进程和nuhup、的区别
  • 【高内聚】设计模式是如何让软件更好做到高内聚的?
  • JavaWeb学习-SpringBotWeb开发入门(HTTP协议)
  • 1.2 基于深度学习的底层视觉技术