C++ 宏与内联函数
因为函数调用需要开销(如:保护调用者的运行环境、参数传递、执行调用指令等),所以函数调用会带来程序执行效率的下降,特别是对一些小函数的频繁调用将是程序的效率有很大的降低。
C++提出了两种解决方法:宏、内联函数。
1. 宏
宏是C++编译预处理系统处理的实体。
宏定义的4种格式:
1)define <宏名> <文字串>
在编译前进行使用文字串进行宏替换
define PI 3.14
2)define <宏名>(<参数表>) <文字串>
在编译前进行使用文字串进行宏替换
define max(a,b) a>b?a:b
3)define <宏名>
只是告诉编译程序该宏名已经被定义,不做任何文字串替换,其用于条件编译
如:define OUTPUTFILE
ifdef OUTPUTFILE
//输出到文件的代码
endif
4)undef <宏名>
用于取消宏名的编译
不足:1)重复计算,如max((x+1),(y+2)),因为其只是进行单纯的文字替换
2)不进行参数类型检查和转换
3)不利于一些工具对程序的处理(如C++程序编译后,所有宏都不存在了)
2. 内联函数
在函数定义中的返回值类型之前加上一个关键字 inline
其作用是建议(具体有没有不一定,有些函数加上也不会作为内联函数对待,如递归函数)编译程序把该函数的函数体展开到调用点,这样就避免了函数调用的开销,从而提高了函数调用的效率。
inline int max(int a,int b)
{return a>b?a:b;}
注意:内联函数名具有文件作用域。
————————————————
内联函数和宏函数的优缺点
内联函数:
内联函数是C++为提高程序运行速度进行的改进,是一种以空间换时间的做法。
内联函数与常规函数
常规函数
运行程序时,常规函数调用会使程序跳到另一个地址(函数地址),并在函数结束时返回。
详细过程:执行到函数调用指令时,程序将在函数调用后立即存储该指令的内存地址,并将函数参数复制到堆栈(为此保留的内存块),跳到标记函数起点的内存单元,执行函数代码(也许还需要将返回值放入寄存器中),然后跳回到地址被保存的指令处。来回跳跃并记录跳跃位置意味着以前使用函数时,需要一定的开销。
内联函数
内联函数的编译代码与其他程序代码内联起来了。也就是说,编译器将使用相应的函数代码替换函数调用。
对于内联函数,程序无需跳到另一个位置处执行代码,再跳回来。因此,内联函数的运行速度比常规函数快,但代价是需要占用更多的内存。
在使用内联函数时,如果调用函数的时间比处理函数的时间长,节省的时间占大头。但如果调用时间小于处理函数的时间短,则没有必要使用内联函数。
要使用内联函数的特性:
需要在函数前加上关键字inline,但inline是建议性关键字,当请求将函数作为内联函数时,编译器并不一定会满足这种要求。内联函数尽量避免函数体过长、含有循环、递归。
内联与宏
内联函数的优势在于做参数类型检查,而宏定义不会,宏只是简单的文本替换。
define SQUARE(X) X*X
1.a = SQUARE(5.0); // a = 5.0 * 5.0
2.b = SQUARE(4.3 + 3.1); // 4.3 + 3.1 * 4.3 + 3.1
3.c = SQUARE(d++) // c == d++ * d++ d递增两次
宏定义时不能忘记括号的使用,否则会造成运算错误。但是上述代码中,加上括号仍然会出现错误,在第三个函数中,d依旧递增两次。如果使用内联函数,则是计算出 d 的值在进行传递,并进行运算,就只会递增一次。
————————————————
通过分享实用的计算机编程语言干货,推动中国编程到2025年基本实现普及化,使编程变得全民皆知,最终实现中国编程之崛起,这里是中国编程2025,感谢大家的支持。
原文链接:https://blog.csdn.net/haitaolang/article/details/69945338
原文链接:https://blog.csdn.net/qq_37934101/article/details/81266548
声明:本文部分素材转载自互联网,如有侵权立即删除 。
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!
8. 精力有限,不少源码未能详细测试(解密),不能分辨部分源码是病毒还是误报,所以没有进行任何修改,大家使用前请进行甄别
丞旭猿论坛
暂无评论内容