内联函数
用inline修饰的函数会成为内联函数,内联函数会在编译的阶段在调用函数的位置进行展开,不会涉及建立栈帧以提高效率,同时每一次的函数调用都会展开整个函数导致内存消耗的增加,是以空间换时间,所以内联函数比较适合代码量小,调用频繁的函数使用。由于内联函数是展开不会有链接的过程,所以声明和定义不能分离,直接展开的内联函数并不会在函数列表中有地址。
内联函数在展开的时候也会因编译器的不同而有不同的实现,编译器会依据函数的实现逻辑完成展开,并不一定会完全照搬代码下来,而且在递归函数中内联函数会失效,多次递归会大量的建立栈帧再将内联函数展开会导致内存花销太大。若内联函数的代码量过大编译器也不会进行展开以避免内存过度消耗的情况。内联的声明是向编译器提交了一个展开请求,这个请求是否执行是编译器决定的并不是一定会被展开。
C++的内联函数更多是替代宏的,宏的使用会在预处理阶段进行代码的替换,这点并不适合调试,同时可读性很差,而且宏是直接替换很容易出现逻辑BUG,而且宏还没有类型检查。所以在C++中若是常量的定义可以使用const enum枚举常量替代,而短小的函数就是用内联函数替代。
auto关键字
auto是一个类型指示符,使用auto修饰的变量编译器会在编译阶段推导其类型。在C++中数据的类型越来越多也越来越复杂,所以使用auto来由编译器自动推导类型会方便许多。由于是编译器自动推导的,所以当我们用auto定义一个变量的时候就需要初始化,不能单独定义一个没有初始化的auto变量。
关于auto修饰指针变量。
auto修饰指针加不加*效果都是一样的但是引用的时候是需要加上&符号的。此外auto是不能直接用于数组声明和函数的参数类型的。