命名空间+缺省参数+const总结+引用总结+内联函数+auto关键字 C++初阶( 七 )

内联函数以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数压栈的开销,内联函数提升程序运行的效率 。
inline int Add(int x, int y){ return x + y;}int main(){ int z = Add(1, 2); return 0;}如果加了inline关键字,编译器在编译期间会用函数体替换函数的调用(类似于宏定义,在编译阶段就替换函数调用 , 将函数调用直接展开,减少了调用的时间,但是空间消耗巨大) 。
下面是内敛函数的几个特性:
1.inline是一种以空间换时间的做法,省去调用函数额开销 。所以代码很长或者有循环/递归的函数不适宜使用作为内联函数 。2.inline对于编译器而言只是一个建议,编译器会自动优化 , 如果定义为inline的函数体内有循环/递归等等,编译器优化时会忽略掉内联(是否称为内联函数由编译器决定) 。3.inline不建议声明和定义分离 , 分离会导致链接错误 。因为inline被展开,就没有函数地址了,链接就会找不到 。
例子:一个相同的函数,一个加了inline 关键字,一个没加,加上一个函数要执行10条指令,文两个函数分别调用1000次要执行多少条指令?普通函数:1000+10(一次调用1次指令,加起来就是1000条,每次调用都是call函数,函数不展开就是10条)内联函数:1000*10条指令(展开就是每次调用都是10条指令)所以说,内联函数展开,会让程序变大,所以代码很短的函数可以考虑有内联,长函数和递归函数不适合用内联 。
auto关键字C++11中 , 标准委员会赋予了auto全新的含义即:auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得 。
int a = 10;auto b = a;// 自动推导b的类型为intauto c = 'c';// 自动推导类型为charcout << typeid(b).name() << endl;cout << typeid(c).name() << endl;//auto d;必须初始化有一下几种用法:

  1. auto与指针和引用结合起来使用(auto和auto*无区别)
int a = 10;// auto和auto*无区别auto pa1 = &a;auto* pa2 = &a;auto& ra = a;// ==> int& ra = a;cout << typeid(a).name() << endl;cout << typeid(pa1).name() << endl;cout << typeid(pa2).name() << endl;cout << typeid(ra).name() << endl;运行结果如下:
命名空间+缺省参数+const总结+引用总结+内联函数+auto关键字 C++初阶

文章插图
  1. 在同一行定义多个变量(这些变量类型必须相同,编译器只对第一个类型进行推导)
auto a = 3, b = 4;auto c = 3.4, d = 5.5;auto i =0, *p = &i;//正确 , i是整型,p是整型指针cout << typeid(a).name() << endl;cout << typeid(b).name() << endl;cout << typeid(c).name() << endl;cout << typeid(d).name() << endl;cout << typeid(i).name() << endl;cout << typeid(p).name() << endl;auto不能推导的两个常见
  1. auto不能作为函数的参数
  2. auto不能直接用来声明数组

推荐阅读