原文:https://blog.csdn.net/haitaolang/article/details/69945338 函数
由于函数调用须要开销(如:保护调用者的运行环境、参数传递、执行调用指令等),因此函数调用会带来程序执行效率的降低,特别是对一些小函数的频繁调用将是程序的效率有很大的下降。工具
C++提出了两种解决方法:宏、内联函数。spa
宏是C++编译预处理系统处理的实体。经过预处理命令#define来定义。宏定义的4种格式:.net
1)#define口<宏名> 口<文字串>blog
在编译前进行使用文字串进行宏替换递归
#define PI 3.14作用域
2)#define口<宏名>(<参数表>)口<文字串>it
在编译前进行使用文字串进行宏替换编译
#define max(a,b) a>b?a:b效率
3)#define口<宏名>
只是告诉编译程序该宏名已经被定义,不作任何文字串替换,其用于条件编译
如:#define OUTPUTFILE
#ifdef OUTPUTFILE
//输出到文件的代码
#endif
4)#undef口<宏名>
用于取消宏名的编译,其后的<宏名>再也不进行替换和有定义。
不足:
1)重复计算,如max((x+1),(y+2)),由于编译预处理会将其替换成:(((x+1)>(y+2))?(x+1):(y+2)),不管(x+1),(y+2)谁大,都会被计算两次。
2)其只是进行单纯的文字替换,不进行参数类型检查和转换(如函数调用时,实参和形参类型不一致,若能转换,编译程序会进行自动(隐式)类型转换,不然指出错误)。
3)不利于一些工具对程序的处理(如C++程序编译后,全部宏都不存在了)
内联函数是指在函数定义中的返回值类型以前加上一个关键字 inline,
其做用是建议(具体有没有不必定,有些函数加上也不会做为内联函数对待,如递归函数)编译程序把该函数的函数体展开到调用点,这样就避免了函数调用的开销,从而提升了函数调用的效率。
inline int max(int a,int b)
{return a>b?a:b;}
注意:内联函数名具备文件做用域,故一个文件中定义的内联函数对于另外一个文件是不可见的。