赞
踩
在c++语言中可以使用
const int A = 3;
代替 #define A 3; 可以做到变量的替换,但是如果是需要体寒更大的函数呢?
C++中使用inline关键字声明内联函数,使用内联函数替代代码片段,达到相似的效果!
注意:内联函数声明时inline关键字必须和函数定义结合在一起,否则编译器会直接忽略内联请求。(先声明后定义)
C++编译器可以将一个函数进行内联编译,被C++编译器内联编译的函数叫做内联函数
- #include <iostream>
- using namespace std;
-
- //inline void printA();
- //inline int myfunc(int a, int b)和函数体的实现,写在一块
-
- inline void printA() //内联函数
- {
- int a = 10;
- cout<<"a = "<<a<<endl;
- }
-
- void printB() //普通函数
- {
- int b = 10;
- cout<<"b = "<<b<<endl;
- }
-
-
- int main()
- {
- printA(); //内联函数调用,完全宏文本替换,编译器操作
- //2 C++编译器直接将函数体插入在函数调用的地方
- //3 内联函数省去了普通函数调用时压栈,跳转和返回的开销
- //会占用较大代码段空间,但反应速度快啊
- // {
- // int a = 10;
- // cout<<"a = "<<a<<endl;
- // }
- printB(); //普通函数调用,每次调用都有压栈、跳转、返回开销
- cout<<"hello..."<<endl;
- system("pause");
- return 0;
- }
深入理解:
1、内联函数不需要声明时加inline, 但一定要在定义的时候加inline,inline关键字一定要和函数体紧密联系关联
2、内联函数是纯文本替换,是编译器完成的,和宏定义在预处理的文本替换不一样,这个过程叫内联编译
3、内联函数在最终生成的编译文件中是没有定义和意义的,他只在编写代码到编译代码期间有意义,因为一旦编译,生成的文件都是一样的编码符号;
4、内联函数会增大代码段所占的数量,占用更大的内存资源,内联函数不需要承担函数调用时的压栈、跳转、返回的时间和资源开销(本质而言:用更大资源(主要内存)开销来换取更快的执行效率,等待浪费的时间少了嘛),所以一般短小精悍的函数代码片段建议使用内联
5、内联inline关键字是对编译器采用内联编译的请求,编译器有可能拒绝或忽略,一旦拒绝或忽,内联函数就变成普通函数编译
6、C++比较智能,在某些情况下即便你没加inline关键字采用内联函数,但编译器也会视情况采用内联(优化)编译
7、C++内联函数的限制:不允许存在循环语句,不能存在过多的条件编译语句,函数体不能态过于庞大,还不能对内联还是哪壶进行取址操作
8、内联函数最大的意义就是省去压栈、调用、返回时的开销,当函数体的执行效率远大于压栈、调用、返回时的开销时,内联函数将失去意义
处理一条语句使用内联函数和宏定义替换区别:
1、使用内联函数是将语句封装为函数,宏定义替换不需要函数
2、不涉及运算,只是文本打印的话,两者效果几乎差不多
3、一旦涉及运算,内联函数是做好封装的,运算顺序已经完整规划排序完成,而宏定义替换只是替换文本,没有经历系统完整的运算顺序的规划,有一定的异变性
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。