宏定义和内联
宏函数:
#define OUTPUTINT(x) cout << “INT:” << x << endl;
宏函数不是函数,只是看起来像函数,使用起来还是在预处理阶段进行代码替换,宏函数省去了函数调用的过程,节省了函数调用的开销。
但是,宏函数在替换过程中会因为运算符优先级产生与预期不一致的结果,于是c++提出了内联函数的概念。
内联函数原理:
在c++中,通过inline关键字将函数定义为内联函数。在编译阶段,编译器在发现inline关键字时会将函数体保存在函数名所在的符号表内,在程序调用内联函数的地方,编译器直接在符号表内获取函数名和函数体,并用内联函数的函数体替换掉函数调用,从而节省了函数调用的开销。
内联函数的定义:
1.在函数定义时使用inline关键字,声明时不能出现inline关键字,使用者不需要知晓函数是否为内联
2.在函数声明的同时给出函数定义,编译器会自动将函数识别为内联函数。将函数定义暴漏给使用者,不推荐此种用法。
内联函数和宏定义的区别:
相同点:二者都可以节省函数调用过程中产生的时间和空间的开销,提高程序执行的效率,目的相同。
本质:宏定义是字符串替换,而内联函数是个函数,具有函数基本性质,因此内联函数可以像普通函数一样调试,而宏定义不可以。
展开阶段:宏定义在预处理阶段展开,内联函数在编译阶段展开,很多编译阶段的工作对内联函数有效,比如类型安全检查和自动类型转换。
内联函数作为类的成员函数时,可以访问类的所有成员,this指针也会被隐式的正确使用,宏定义无法实现。
注意点:
定义内联函数时,需要注意函数体的体积。如果函数体庞大,代码展开后会造成程序代码体积极度增长,出现代码膨胀。当然现在的编译器优化后,会自动判断用户定义的内联函数是否适合,如果不适合,是不会进行代码展开的。