1.内联函数
1.1概念
以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序的效率
如果在上述函数前增加inline关键字将其改成内联函数,在编译期间编译器会用函数体替换函数的调用。
查看方式:在release模式下,查看编译器生成的汇编代码是否存在call Add
1.2特性
- inline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会用函数体替换函数调用,缺陷:可能使目标文件变大,优势:少了调用开销,提高程序运行效率
- inline对于编译器而言只是一个建议,不同编译器关于inline实现机制可能不同,一般建议:将函数规模较小(即函数不是很长,具体没有准确说法,取决于编译器内部实现)、不是递归、且频繁调用的函数采用inline修饰,否则编译器会忽略inline特性。
- inline不能将函数声明和定义分开,分离会导致链接错误。因为inline被展开,就没有函数地址了,链接就会找不到。
//F.h
#include<iostream>
using namespace std;
inline void f(int i);
//F.cpp
#include"F.h"
void f(int i)
{
cout<< i <<endl;
}
//main.cpp
#include"F.h"
int main()
{
f(10);
return 0;
}
//链接错误
思考题:为什么不用宏函数?
宏函数的优点:不需要建立栈帧,提高调用效率缺点:复杂、容易出错、可读性差、不能调试
而宏的缺点刚好可以用内调函数弥补,所以相对于内调函数,宏函数没什么优势
2.auto关键字
2.1类型别名思考
随着编程越来越复杂,程序中用到的类型也越来越复杂,经常体现在:
1.类型难于拼写2.含义不明确容易导致出错
typeid可以打印数据类型
auto可以根据右边表达式自动推导数据类型
int main()
{
int a = 10;
auto c = a;
auto d = 1 + 1.11;
cout << typeid(c).name() << endl;//int
cout << typeid(d).name() << endl;//double
return 0;
}
在C++11中,标准委员会赋予了auto全新的含义即:auto不再是一个存储型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。
2.2auto的使用规则
1.auto与指针和引用结合起来使用
用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型时必须加&
int main()
{
int x = 10;
auto a = &x;
auto* b = &x;
auto& c = x;
cout << typeid(a).name() << endl;
cout << typeid(b).name() << endl;
cout << typeid(c).name() << endl;
*a = 20;
*b = 30;
c = 40;
return 0;
}
2.在同一行定义多个变量
当在同一行声明多个变量时,这些变量必须是相同类型,否则编译器会报错,因为编译器实际只对第一个类型进行推导,然后推导出来的类型定义其他变量。
int main()
{
auto a = 1, b = 2;
auto c = 3, d = 4.0;//编译失败,因为c和d的初始化表达式类型不同
return 0;
}
2.3auto不能推导的场景
1.auto不能作为函数的参数
void Func(auto a)
{}
//此处编译失败,auto不能作为形参类型,因为编译器无法对a的实际类型进行辅导
2.auto不能直接用来声明数组
int main()
{
int a[] = { 1,2,3 };
auto b[] = { 4,5,6 };//编译失败
return 0;
}
3.基于范围的for循环
3.1范围for的语法
for循环后的括号由冒号" : "分为两个部分:
第一个部分时范围内用于迭代的变量,
第二部分则表示被迭代的范围
int main()
{
int arr[] = { 1,2,3,4,5 };
int sz = sizeof(arr) / sizeof(arr[0]);
for (int i = 0; i < sz; i++)
arr[i] *= 2;
for (int* p = arr; p < arr + sz; p++)
cout << *p << endl;
//适用于数组
//依次取数组中的数据赋值给e
//自动迭代,自动判定结束
for (auto e : arr)
cout << e << endl;
return 0;
}
3.2范围for的使用条件
1.for循环迭代的范围必须是确定的
对于数组而言,就是数组中第一个元素和最后一个元素的范围;
注意:以下代码就有问题,因为for的范围不确定
void TestFor(int arr[])
{
for (auto e : arr)
cout << e << endl;//编译失败
}
感谢各位宝宝观看!!!看完请留下你的👍,表示你对我的喜爱哦!!嘻嘻