基本语言细节--inline函数的几点分析
2013-11-14 16:22
253 查看
基本语言细节--inline函数的几点分析
1.定义:内联函数从源代码层看,有函数的结构,而在编译后,却不具备函数的性质。内联函数不是在调用时发生控制转移,而是在编译时将函数体嵌入在每一个调用处。编译时,类似宏替换,但比宏更安全,使用函数体替换调用处的函数名。一般在代码中用inline修饰,但是能否形成内联函数,需要看编译器对该函数定义的具体处理。
2.好处:内联扩展是用来消除函数调用时的时间开销。它通常用于频繁执行的函数。
一个小内存空间的函数非常受益。
3.为什么inline能取代宏:
1、 inline 定义的类的内联函数,函数的代码被放入符号表中,在使用时直接进行替换,(像宏一样展开),没有了调用的开销,效率也很高。
2、 内联函数是一个真正的函数,编译器在调用一个内联函数时,会首先检查它的参数的类型,保证调用正确。然后进行一系列的相关检查,就像对待任何一个真正的函数一样。这样就消除了宏的隐患和局限性。
3、 inline 可以作为某个类的成员函数,当然就可以在其中使用所在类的保护成员及私有成员。
4.inline与宏的区别:
1、内联函数在编译时展开,宏在预编译时展开;
2、内联函数直接嵌入到目标代码中,宏是简单的做文本替换;
3、内联函数有类型检测、语法判断等功能,而宏没有;
4、inline函数是函数,宏不是;
5、宏定义时要注意书写(参数要括起来)否则容易出现歧义,内联函数不会产生歧义
5.inline注意事项:
1、在内联函数内不允许用循环语句和开关语句。
2、内联函数的定义必须出现在内联函数使用内联将导致第一次被调用之前。
3、内联函数只是向编译器的一个申请。
4、如果函数体内的代码比较长,内存消耗代价较高。
5.析构函数和构造函数,应该不用内联,因为再其执行过程中会有隐式成员以及基类的析构函数(如果有的话)被调用。
6.递归函数不应该声明为内联函数。
7.内联函数的扩展汇带来参数求值操作以及临时性对象的管理,而致使程序膨胀!不可轻易使用!
wolangjushi 于HUST2013.11.14 整理于网上
1.定义:内联函数从源代码层看,有函数的结构,而在编译后,却不具备函数的性质。内联函数不是在调用时发生控制转移,而是在编译时将函数体嵌入在每一个调用处。编译时,类似宏替换,但比宏更安全,使用函数体替换调用处的函数名。一般在代码中用inline修饰,但是能否形成内联函数,需要看编译器对该函数定义的具体处理。
2.好处:内联扩展是用来消除函数调用时的时间开销。它通常用于频繁执行的函数。
一个小内存空间的函数非常受益。
3.为什么inline能取代宏:
1、 inline 定义的类的内联函数,函数的代码被放入符号表中,在使用时直接进行替换,(像宏一样展开),没有了调用的开销,效率也很高。
2、 内联函数是一个真正的函数,编译器在调用一个内联函数时,会首先检查它的参数的类型,保证调用正确。然后进行一系列的相关检查,就像对待任何一个真正的函数一样。这样就消除了宏的隐患和局限性。
3、 inline 可以作为某个类的成员函数,当然就可以在其中使用所在类的保护成员及私有成员。
4.inline与宏的区别:
1、内联函数在编译时展开,宏在预编译时展开;
2、内联函数直接嵌入到目标代码中,宏是简单的做文本替换;
3、内联函数有类型检测、语法判断等功能,而宏没有;
4、inline函数是函数,宏不是;
5、宏定义时要注意书写(参数要括起来)否则容易出现歧义,内联函数不会产生歧义
5.inline注意事项:
1、在内联函数内不允许用循环语句和开关语句。
2、内联函数的定义必须出现在内联函数使用内联将导致第一次被调用之前。
3、内联函数只是向编译器的一个申请。
4、如果函数体内的代码比较长,内存消耗代价较高。
5.析构函数和构造函数,应该不用内联,因为再其执行过程中会有隐式成员以及基类的析构函数(如果有的话)被调用。
6.递归函数不应该声明为内联函数。
7.内联函数的扩展汇带来参数求值操作以及临时性对象的管理,而致使程序膨胀!不可轻易使用!
wolangjushi 于HUST2013.11.14 整理于网上
相关文章推荐
- Network Link Conditioner模拟不同网络环境
- .net学习图片防盗链
- VS2008远程调试
- codeforces-363A. Soroban
- django验证吗记录
- VC2005调试: DLL调试, 远程调试;
- ubuntu ufw 防火墙
- Linux中Kill进程的N种方法
- 黑马程序员-javaSE学习之语言基础细节详解
- UIDynamicAnimator
- EF在单例模式及C/S方式开发时,操作数据对象以后如果发生异常,要做善后工作。
- centos5.5安装zabbix2.0.9
- java练习 jtable增加删除
- Linux性能监控:/proc/loadavg
- SmartFoxServer项目总结
- Android TextWatcher监控EditText中的输入内容并限制其输入字符个数
- 关于ora-04065和ora-04068的原理解释
- 对Ron Eglash在Ted演讲上提到的Bamana沙地符号的想法
- Spring MVC 对于@ModelAttribute 、@SessionAttributes 的详细处理流程
- $.ajx的用法