当前位置:网站首页>宏,函数和内联函数
宏,函数和内联函数
2022-06-29 08:23:00 【会飞的胖达喵】
宏,函数和内联函数
宏和函数的区别:
1,
宏作的是简单的字符串的替换(不包括数据类型)。
函数的参数传递是有数据类型的。
2,
宏的参数替换是不经过计算直接处理的。
函数调用是将实参的值传给形参(需要先经过计算)
3,
宏的替换是在编译之前执行的,即用宏体代替宏名,然后再进行编译。
函数的调用是在编译以后。
所以:宏占用的是编译的时间,函数占用的是执行的时间。
4,
宏的参数是不占用内存空间的(仅仅是字符串的替换)
函数调用的参数传递则是具体变量之间的信息传递,形参作为局部变量肯定是要占用内存的。
5,
宏的替换是不需要时空开销的。
函数在调用的时候需要一定的时空开销,系统在调用函数的时候需要保留现场,然后转入被执行函数去执行,调用完,再返回主调函数,此时再恢复现场。
宏函数的缺陷:
(1)必须要加括号才能保证运算完整
#define add(x,y) x+y
int main()
{
int a = 1;
int b = 2;
int ret = add(a,b)*10;
cout<<ret<<endl;
//输出的结果不是30,而是21。
//因为宏函数作的只是简单的字符串的替换,直接将x+y拿了下来,由于没有加括号,倒是b先和10进行了运算。
}
(2) 即使加了括号,有些运算依然与预期不符。
#define compare(a,b) (((a)<(b))?(a):(b)) //能加的括号都加了
int main()
{
int a = 10;
int b = 20;
int ret = compare(++a,b);//预期:如果a自增完依然没有b大,那么就返回a的结果,否则就返回b的结果。
cout<<ret<<endl;//预期的结果是11,但是结果是12
//因为运算的是(((++a)<(b))?(++a):(b)),一共做了两次运算,所以就是12.
//这就是宏函数替换的参数就是字符串,而正常函数传的是值(计算后的值)。
}
内联函数:
定义
本身就是一个真正的函数,不会出现以上的缺陷,拥有普通函数的一切行为。与函数唯一的不同就是会在适当的地方像宏一样的展开。回忆下宏函数的优势:不需要入栈和出栈,直接作字符串的替换,直接跑源码,以空间换时间。而内联函数正好解决了宏函数的缺陷并且继承了它的优点。
在普通函数前面加 inline 关键字使之称为内联函数
注意:函数体必须和声明结合在一起,否则编译器还是当作普通函数对待。函数的声明和实现必须同时加关键字 inline 才算是内联函数。
注意:类中的函数系统自动帮你加了隐藏的inline函数,因为类中的函数一般都比较的短小,这样就适合直接跑源码,这样就不会有时间上的开销了,节约了时间,提高运行速度。
内联函数和编译器
以下情况,编译器不会直接处理你写的内联函数源码。
1,不能存在任何形式的循环语句。
2,不能存在过多的条件判断。
3,函数体不能过于庞大(没有明确规定多大)。
4,不能对函数进行取址操作(内联函数自己是没有地址的,直接跑的就是源码,没有函数的入口,取地址没有意义)。
所以:内联仅仅是个编译器的一个建议,编译器不一定会接收这种建议。如果你没有将函数声明为内联函数,那么编译器也是可能将此函数作为内联函数处理的。一个好的编译器自己会将小的,简单的函数内联。
————————————————
版权声明:本文为CSDN博主「是小明同学啊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_51399192/article/details/122738397
边栏推荐
- Intelligent hardware EVT DVT PVT mp
- 乘法器设计(流水线)verilog code
- First electric shock, so you are such a dragon lizard community | dragon lizard developer said that issue 8
- Write time replication of hugetlbfs
- Baodawei of the people's Chain: break down barriers and establish a global data governance sharing and application platform
- Differences between x86 and x64
- 2022第六季完美童模 清远赛区 海选赛圆满落幕
- The sixth season of 2022 perfect children's model Qingyuan competition area audition came to a successful conclusion
- How to gain profits from the operation of the points mall
- 批量处理实验接触角数据-MATLAB分析
猜你喜欢

Transformer details

io流的总结

Some "non-technical" Thoughts on distributed digital identity

uniapp引入组件不生效解决方法

闭关修炼(二十一)Servlet生命周期、service方法源码分析、线程安全问题

二手交易平台碳减排,有了评估标准
![[untitled]](/img/6e/5dd5dcff89a74f7d367c9186a77268.png)
[untitled]

hostname -f与uname -n的返回值可能不同
Working for many years, recalling life -- three years in high school

Leetcode (142) - circular linked list II
随机推荐
今年的网络安全“体检”你做了吗?
首次触电,原来你是这样的龙蜥社区 | 龙蜥开发者说第8期
十大券商账号开户安全吗?是靠谱的吗?
Carbon emission reduction of second-hand trading platform, with assessment standards
【最全】PS各个版本下载安装及小试牛刀教程(PhotoShop CS3 ~~ PhotoShop 2022)
Verilog 拼接操作符号
今天让你知道PMP考试通过率达97%,可信不可信
操作系统产品密钥查看方法
2022第六季完美童模 海口赛区 选拔赛圆满落幕
编程语言
C# 语音端点检测(VAD)实现过程分析
单例模式的理解
Is it really safe to open a stock account online? Find the answer
51单片机中断与定时器计数器,基于普中科技HC6800-ESV2.0
成员内部类、静态内部类、局部内部类
2022 spring summer collection koreano essential reshapes the vitality of fashion
Open an account to buy funds. Is it safe to open an account through online funds-
Product manager certification enrollment brochure (NPDP) in July 2022
15 things to learn in a year of internship in famous enterprises, so you can avoid detours.
TypeScript 变量声明 —— 类型断言