内联函数
内联的引出
调用函数就要建立栈帧,建立栈帧需要耗费资源。
在C语言角度采用了宏函数来解决这一问题,但是宏函数也有缺点。
缺点:
1.不方便调试。
2.代码可读性差。
3.没有类型安全的的检查
优点:
1.增强代码复用性。
2.提高性能。
C++用枚举,const,内联,inline函数,代替宏,而内联函数则是在需要经常调用,代码精简的函数前面加上inline。来使他在编译时就展开。
编码经常需要交换,这里以swap为例,我们有两种方法检查他是否有调用(call swap)
1.因为inline是一种优化。所以我们直接在release模式下查看编译器的汇编代码中是否有call swap。
2.在debug模式下,编译器默认不优化,所以我们需要对vs2013做出设置。
继续查看汇编,没有call直接进行展开。
内联的特点
1.因为实在编译的时候展开,所以是一种以空间换时间的做法。代码很长,递归就不把它作为内联函数了。
2.他只是一种建议,比如你非要定义,那编译器检测你有上述两种情况,在编译的时候他可以不接收,忽略掉内联。
3.inline不建议声明和定义分离,分离会导致链接错误,因为inline被展开没有函数地址,链接的时候找不到。
auto关键字
auto属于c++11,它的作用是自动识别类型。使用时必须初始化。在以后学习map后更有作用。
使用时需要注意:
- 一行变量是相同类型可以写在一行,一行有多个不同类型不能用。
- auto不能做函数参数,因为编译的时候不知道auto的类型,只有在调用的时候在传实参。
- 不能推导数组。(可以传引用)
基于范围的for循环
冒号":"将括号分为两部分,第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围。
int arr[] = { 1, 2, 3, 4, 5 };
for (auto& e : arr)
{
e *= 2;
}
for (auto a : arr)
{
cout << a << endl;
}
auto e传值的话,e改变不影响数组。只有传引用改变了数组内部的值。
指针空值
NULL实际上是一个宏
所以这两个实际上是一样的
然后我们进行调用,意愿是一个调用第一个,一个调用第二个。
f(0);
f(NULL);
实际上全部调用了第一个函数
所以在C++11引入了nullptr