内敛函数
内敛函数
1.为什么有内敛函数
c语言库中的许多函数都是用宏函数来写的,主要原因调用函数会有参数压栈建立栈帧的消耗,宏函数是替换原来的函数,省去了建立栈帧的开销,提高了效率。但是宏函数很难阅读,不便维护。
c++中为了解决这一问题引入了内敛函数的概念,和正常函数定义方式一样,然后对函数进行替换,而不是建立栈帧。
2.内敛函数使用
内敛函数的定义就是在原来的函数前面加上 inline
inline int Add(int x, int y)
{
return x + y;
}
下面我们看下源代码来理解
3.内联函数特性、注意事项
1.inline 的目的是用空间换取时间,主要换取的是调用函数建立栈帧消耗的时间,一般函数内部代码比较少的时候(1-5行)建议使用inline,但是当函数内部代码较多(多于10行)或者内部有循环/递归时不建议使用inline,当然此时编译器在编译时也不会把它当成内敛函数来编译,因为如果这样使用,则执行内部代码的时间远大于使用inline换取的时间。那使用inline也就没有意义了。
2.在内联函数的声明和定义一定不能分开。内联函数是在原位置展开的,并没有记录函数的地址,在链接时自然也就找不到该函数了。
4.宏函数的优缺点
宏函数:
优点:
1.代码复用性高
2.效率高
缺点:
1.可读性差
2.不方便调试
auto关键字
1.auto 的定义
在c++11后,auto已经变成了类型指示符,它定义变量时编译器可以在编译时推导出变量的类型。
2.auto的使用
int a = 1;
auto b = a; //编译器可根据表达式推导出来 b 是int类型
3.auto使用注意事项
auto 定义的变量必须初始化。因为编译器是根据表达式推导出变量的范围的。也可以认为auto只是占位用的,编译时编译器会将真正的范围替换auto。
4.auto使用细则
1.auto定义指针和引用
int *a = nullptr;
auto b = a;
auto* c = a;//这两种方式都可以定义指针
auto& d = a;//定义引用必须加 & 编译器才能推导出来定义的是引用
2.auto可以声明多个变量,但是多个变量的类型要相同
auto a = 1, b = 2; //可以推导出 a和b 的类型是 int
auto a = 1.0, b = 2.0; //可以推导出 a和b 是float
auto a = 'a', b = 'b';//可以推导出 a和b 是char
auto a = 1, b = 2.0, c = 'c'; //这样定义就不行,因为编译器只根据声明的第一个元素
//的类型来声明后续变量。
范围for循环
1.范围for循环的使用规范
int a[] = {
1, 2, 3, 4, 5, 6 };
//正常情况下遍历数组
for (int i = 0; i < sizeof(a) / sizeof(a[0]); ++i)
{
cout << a[i] << " ";
}
cout << endl;
//范围for遍历
for (auto e:a)
{
cout << e << " ";
}
cout << endl;
2.范围for循环的使用条件
迭代的范围必须要确定,数组的范围就是第一个元素到最后一个元素。
void testFor(int *a)
{
for (auto e:a) //这样使用是不正确的 a 仅仅表示的是数组的首地址,无法确定数组的范围。
{
cout << e << endl;
}
}