C++第四节课 - 内联函数 + 初认类

一、auto关键字

C++中可以使用typeid打印变量的类型

#include<iostream>
using namespace std;

int main()
{
	int a = 0;
	int b = a;
	auto c = a;
	auto d = 1 + 1.11;
	cout << typeid(c).name() << endl;
	cout << typeid(d).name() << endl;
	return 0;
}

但是上面看不出来auto的实际作用,但是auto对于类型很长的名字的作用非常大!

        如果一个函数需要运行很多次,普通的函数需要创建多次函数栈帧,造成效率低下!此时我们可以使用宏函数!

        宏函数:通常在预处理阶段进行展开,使用宏定义(如C语言中的#define)来替代代码。它们不占用内存空间,直接在编译时替换。

  • 优点:不需要建立栈帧,提高调用效率;
  • 缺点:复杂,容易出错,可读性差,不能调试!

Auto的补充:

1、Auto的使用规则

int main()
{
	int x = 10;
	auto a = &x;
	auto* b = &x;  // b和a是等价的!
	auto& c = x;   // c是x的引用!
	return 0;
}

        用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型时则必须
加&!

auto常用于for循环:

int main()
{
	int x = 10;
	auto a = &x;
	auto* b = &x;  // b和a是等价的!
	auto& c = x;   // c是x的引用!

	int arr[] = { 1,2,3,4,5 };
	for (auto& x : arr)
	{
		x++;
	}
	for (auto& x : arr)
	{
		cout <<x<<endl;
	}
	return 0;
}

        for (auto& x : arr):这是一个范围基于的 for 循环,auto& 表示 x 是 arr 中每个元素的引用。使用引用可以避免复制元素,提高效率。 

2、Auto不能推导的场景

  • auto不能作为函数的参数
// 此处代码编译失败,auto不能作为形参类型,因为编译器无法对a的实际类型进行推导
void TestAuto(auto a)
{}
  • auto不能直接用来声明函数
void TestAuto()
{
    int a[] = {1,2,3};
    auto b[] = {4,5,6};
}

3. 为了避免与C++98中的auto发生混淆,C++11只保留了auto作为类型指示符的用法
4. auto在实际中最常见的优势用法就是跟以后会讲到的C++11提供的新式for循环,还有
lambda表达式等进行配合使用。

二、内联函数

引入:内联函数

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

缺点: 

每次调用的指令都是一样的,那么当调用多次,重复的指令不会相乘,而是相加起来! 

内联展开是将Func中的50条指令插入到调用的位置上去!(导致可执行程序变大!)

因此,内联函数适用于短小的频繁调用的函数!

需要注意的是:inline对于编译器仅仅只是一个建议,最终是否成为inline,需要编译器自己决定!

像下面类似的函数就算加上了inline也会被否决掉!

  • 比较长的函数;
  • 递归函数;

默认的debug模式下,inline不会起作用,否则不方便调试!(默认如果起作用,相当于指令展开了,没有创建函数栈帧,无法进入函数内部,不能调试!)

改成releas可以起作用,但是releas不容易查看汇编代码!(需要自己设置)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一道秘制的小菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值