目录
一.内联函数
二.auto关键字(C++11)
三.范围for
四.nullptr
一.内联函数
C++用inline修饰的函数,会在编译时在调用内联函数的地方展开,没有了函数调用建立栈帧的开销,内联函数提升程序运行的效率。
对于一个短小的函数例如Swap(),如果高频调用,那么
C语言的优化方案是————宏函数;
C++的优化方案是————inline 内联函数;
而对于宏函数 虽然它有着
a.代码可维护性(改一个则改了全部 #define DataType int ),增强了代码的复用性。
b.提高效率,减少了栈帧开销。
的优点
但是他有很多缺点,比如:
a.可读性差
b.没有类型安全检查
c.不方便调试(因为预编译阶段就替换掉了)
小插曲:还记得定义一个ADD宏的写法吗?
#define ADD(a,b) ((a)+(b)) 没有分号
到了C++中,我们以后就不要再使用宏了,以免造成不必要的麻烦。
在《effective C++》中,有一个条款说明了:“尽量用const 、enum、inline去替代宏”
注意:
1.inline是以空间换时间的做法,如果把函数内联处理了,在编译阶段会用函数体代替调用函数(我们可以在编译器中查看汇编代码中有没有用call来判断是否调用了函数)。
2.inline对于编译器而言就是一个 建议 ,不同编译器对于inline实现机制可能不同,一般建议将函数规模小(其实函数规模算不算小这点还是由编译器说了算)、不是递归且频繁调用的函数进行inline处理。
注意!!!———如果编译器认为你这个函数内敛之后得不到什么优化(如所有递归函数),那它就会忽略inline请求,而是老老实实去调用函数创建栈帧。
3.inline函数声明和定义不能分开,否则会导致链接错误。
因为inline在调用时会展开,就没有函数地址了,链接时找不到(符号表里面没有它的函数地址)
二.auto关键字(C++11)
自动识别类型关键字 auto
使用场景:
1.范围for
例子:
int main()
{
int a[] = { 1,2,3,4,5,6,7,8,9,1,2,3,54 };
for (auto e : a)//这里的原理是:自动取a的的数据赋值给e
{
cout << e << " ";
}//自动迭代,自动判断结束。
cout << endl;
return 0;
}
2.类型比较长的时候,auto可以自动推导
3.对于下面这几个auto写法,要注意他所代表的意义
int x = 10;
auto a = x;//auto自动识别为int
auto pa = &a;//auto自动识别为int*
auto* pa1 = &a;//auto* 自动识别为int*,*的作用是 强调 pa1是个指针
auto& c = x;//auto&自动识别为int& ,&的作用是 强调c是个引用。
三.范围for
范围for其实是比较复杂的,我们现在入门先了解一下
以后遍历数组可以直接写成这样子:
//范围for再熟悉
int main()
{
int a[] = { 1,2,3,4,5,6,7,8,91,0,2,5,1,65,165 };
for (auto e : a)
{
cout << e << " ";
}
cout << endl;
return 0;
}
范围for的原理就是:
1.范围for自动知道数组中的元素的个数。
2.自动把数组的每一个元素迭代一次。
四.nullptr
空指针
以后再C++中空指针不要再写成NULL了,需要写成nullptr。
因为NULL其实是C语言中定义的一个宏,他的值为0,。所以有可能导致再使用时被误认为是 int 0之类的东西。
而nullptr就是纯粹的空指针。