当前位置:网站首页>宏,函数和内联函数
宏,函数和内联函数
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
边栏推荐
- Unity C# 网络学习(十二)——Protobuf生成协议
- 【最全】PS各个版本下载安装及小试牛刀教程(PhotoShop CS3 ~~ PhotoShop 2022)
- Some behaviors of Apple developers that are prone to investigation
- TypeScript 變量聲明 —— 類型斷言
- 2022年7月系统集成项目管理工程师认证招生简章
- First electric shock, so you are such a dragon lizard community | dragon lizard developer said that issue 8
- 802.11--802.11n protocol phy
- Open an account to buy funds. Is it safe to open an account through online funds-
- 51 MCU interrupt and timer counter, based on Puzhong technology hc6800-esv2.0
- 积分商城运营要如何做才能获取到利润
猜你喜欢

二手交易平台碳减排,有了评估标准

MT-yolov6训练及测试

ThreadLocal线程变量

laravel 8 实现 订单表按月份水平分表

Simple use of vlookup function in Excel -- exact matching or approximate matching data

微积分学习

Speech signal processing - Fundamentals (I): basic acoustic knowledge

How to recite words in tables

重磅发布 | 《FISCO BCOS应用落地指南》

2022 Season 6 perfect children's model Haikou competition area trial successfully concluded
随机推荐
积分商城运营要如何做才能获取到利润
十大券商账号开户安全吗?是靠谱的吗?
Calculus Learning
关于父母离婚后子女姓名变更有关问题的批复
工作好多年,回忆人生--高中三年
laravel 8 实现 订单表按月份水平分表
Summary of various series (harmonic, geometric)
Huawei equipment is configured with medium-sized network WLAN basic services
P6772 [noi2020] gourmet (matrix fast power)
2022春夏系列 KOREANO ESSENTIAL重塑时装生命力
15 things to learn in a year of internship in famous enterprises, so you can avoid detours.
Verilog 大小端以及 +:使用
The return values of hostname -f and uname -n may be different
今年的网络安全“体检”你做了吗?
New paid Tarot calculation source code (with building tutorial)
乘法器设计(流水线)verilog code
Baodawei of the people's Chain: break down barriers and establish a global data governance sharing and application platform
机器人代码生成器之Robcogen使用教程
Did you really make things clear when you were promoted or reported?
Dialogue | prospects and challenges of privacy computing in the digital age