2024年C C++最全[C++] 内联函数inline 以及 auto关键字 -- C++入门(4,吊打面试官

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取


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


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

1.3内敛函数的特性

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

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

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

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

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

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

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

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

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

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

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

2.auto关键字

2.1auto简介

在早期
C/C++

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

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

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

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

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

注意:

使用
auto
定义变量时必须对其进行初始化,在编译阶段编译器需要根据初始化表达式来推导
auto
的实际类

。因此
auto
并非是一种

类型

的声明,而是一个类型声明时的

占位符

,编译器在编译期会将
auto
替换为
变量实际的类型

2**.2 auto的使用细则**

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

  1. 在同一行定义多个变量当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量
	auto a = 1, b = 2;
	auto c = 3, d = 4.0;//c和d类型不同,auto推导会冲突的

2**.3 auto不能推导的场景**

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

2. auto不能直接用来声明数组

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

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

};
}



[外链图片转存中...(img-z2ORT6OV-1715531780733)]
[外链图片转存中...(img-YqK7YM2w-1715531780735)]

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618668825)**

  • 17
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值