C里面的宏函数
C语言中的宏函数会在预处理阶段就去替换程序中的宏,宏函数无法在调试的时候进行检查,并且没有类型检查,还容易写错 ;
如果对于一个需要经常调用的小函数,使用普通函数,需要频繁的创建栈帧,消耗时间空间,所以C++中引入了内联函数;
inline --内联函数
内联函数是C++的一个特质,内联函数会在调用函数的时候展开,而不是创建堆栈去call一个函数,没有函数调用堆栈的一个开销,可以提升函数的运行效率。 内联函数的性质:其实是在编译器中用时间换空间(这里的空间指的就是编译出来的可执行程序的大小),在编译阶段,就会把add内联函数展开。
对于一些较长的函数,即使前面加了Inline关键字,编译器也不会将他视为内联函数进行展开,即自适应内联函数。为什么函数过长之后,编译器不支持展开?主要原因是容易造成代码膨胀,使得可执行程序.exe过大,不利于下载。
补充说明:内联函数只是向编译器发出请求,而编译器可以忽视这种请求,选而直接call函数;
要注意,使用递归函数的时候不要使用inline关键字。同时,inline不建议声明和定义分开,分离会导致链接错误,因为inline函数并不进入编译阶段程序创建的符号表,没有地址可以找到,最后链接就会失效。
auto ---自定义类型
auto也是c++新出的一个特性,简单来说就是自适应类型,auto定义变量的时候,必须初始化,才能在编译期间推导自己属于什么变量。
注意for(auto x:arr)其中这个x只是arr的一个拷贝,修改x的值并不能修改arr数组中的值,修改arr数组中的值需要用到引用
auto在指针使用的时候,可以不用带*,但是在使用引用时,必须带&
int main()
{
int a = 10;
auto pa = &a;
auto* pa2 = &a;
auto& ra = a;
cout << typeid(pa).name() << endl;
cout << typeid(pa2).name() << endl;
cout << typeid(ra).name() << endl;
}
typeid(变量名).name() 可以打印出对象的类型;
auto x=10,b=10.2; //错误,auto的一行类型必须一致
auto arr[]={1,2};//错误,不能用于构建数组
auto x=1,y=2; //正确,类型一致
auto不能使用的场景:
1、做函数的形参推导名
void test(auto x); //错误,在运行阶段,需要开辟栈帧,而无从推导需要开辟多大的栈帧
2、不能用于声明数组
nullptr ---空指针类型
void func(int)
{
cout<<"func(int)"<<endl;
}
void func(int*)
{
cout<<"func(int*)"<<endl;
}
int main()
{
func(0);
func(NULL);
func((int*)NULL);
return 0;
}