一、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不容易查看汇编代码!(需要自己设置)