心有所向,日复一日,必有精进
专栏《C++修炼秘籍》
目录
上篇博客,简单介绍了C++入门的部分知识,接下来我们介绍,内联函数,auto等知识,有些大致了解即可,gogogo
内联函数
以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调
用建立栈帧的开销,内联函数提升程序运行的效率。
ps:像快速排序时,每趟排序都需要交换数据,单独写出一个交换函数比较好,可以重复利用,但是这回每次交换都要建立函数栈帧,很多次很多次后,消耗有点大,所以可以使用内联函数;
在C语言中是如何解决这个问题呢?可以使用宏函数,在预处理阶段就可以替换
而C++提供了内联函数,那有宏函数为什么创造了内联函数?
- int Add(int x, int y){
- return x + y;
- }
- int main(){
- int ret = 0;
- ret = Add(1, 2);
- return 0;
- }
'运行
假如,Add要多次重复调用,我们尝试的写一下Add的宏函数:
#define Add(x,y) ((x)+(y))
但是,会不会有写成如下这样的吗?
- #define Add(int x,int y) {return x + y;}
- #define Add(x,y) x+y
- #define Add(x,y) (x)+(y)
- #define Add(x,y) (x+y)
- #define Add(x,y) ((x)+(y));
这个错的太离谱了,完全忘了宏函数了
#define Add(int x,int y) {return x + y;}
宏是替换,有时候可能做判断,像这样写就出bug了;
- #define Add(x,y) ((x)+(y));
-
- if(Add(a,b)){
- //……
- }
- //替换后
- if(((x)+(y));){
- //……
- }
如果不加外面的括号,像下面的情况,容易出现优先级问题;
- #define Add(x,y) (x+y)
-
- Add(x,y) * 3;
不加里面的括号时,当传参是表达式,容易出问题;
- #define Add(x,y) (x+y)
-
- Add(a|b,a&b);
ps:一个程序员想写bug,谁都拦不住;