内联函数
来源:互联网 发布:广联达施工进度软件 编辑:程序博客网 时间:2024/06/13 16:47
内联函数类似于C里边的宏,只是宏经常有一些不安全因素,比如 宏定义 add() 是 a+b,调用的时候宏定义直接展开,不做任何的判断,如果调用res = add()*c; 得到的代码就是res = a+b*c;不是想要的结果。
内联函数可以理解成一个安全的宏定义,他就是一个真正的函数,只是不用压栈出栈,速度快,而且比宏定义安全,所以利用 短且频率 比较高的函数可以写成内联函数inline。
内联函数在编译时,会将此内联函数代码直接编译到调用函数之处。减少了一次函数调用时的跳转、数据压栈等操作。所以相比调用行数,内联函数的执行效率要相对高点。不过也正因为如此,所以最终生成的程序文件要稍微大点。
1.内联函数可减少cpu的系统开销,并且提高整体程序的速度,但当内联函数很大时,会有相反的作用,因此一般比较小的函数才使用内联函数。
2.有两种内联函数的声明方法,一种是在函数前使用inline关键字;另一种是在类的内部定义函数的代码,这样的函数将自动转换为内联函数,而且没必要将inline放在函数前面。
3.内联是一种对编译器的请求,像register说明符一样。下面这些情况会阻止编译器服从这项请求.如果函数中包含有循环,switch或goto语句,递归函数,含有static的函数.
C语言中内联函数到底有什么作用?
试想一下,每当我们在假设就在主函数中调用另外一个函数的时候,那么这个函数就要入栈或者出栈,比如说下面的一个例子:
点击(此处)折叠或打开
- Void myprint()
- {
- Printf("%d",3);
- }
- Void main()
- {
- Int i;
- For(i=0;i<100;i++)
- Myprint(2);
- }
在主函数中调用myprin()函数打印2这个数字,那么我们就要调用函数100次,意味着这个函数要进栈100次,出栈100次,这样一来我们就打印一个小小的2就把大量的时间花费在进栈和出栈之上了,当我们把程序改为如下所示的时候呢:
点击(此处)折叠或打开
- Void main()
- {
- Int i;
- For(i=0;i<100;i++)
- Void myprint()
- {
- Printf("%d",3);
- }
- }
- 此时相当于
- static inline void myprint(int n);
- static inline void myprint(int n)
- {
- printf("%d",n);
- }
- void main()
- {
- int i;
- for(i=0;i<100;i++)
- myprint(3);
- }
此时我们就不需要进栈出栈了,直接打印2就可以了,当然无论任何事,得到了一定的方便之后就必须得付出一定的代价,即此时的空间的问题。打个比方,现在我们要去一个超市买东西,而超市距离我们家有好几里路,此时你要话费一定的时间在去超市的路上,可是现在呢超市已经搬到家里了,我们就没有必要去超市了,因为超市已经在家里了,当然你的家有那么大?能容得下一个超市?所以此时就存在一个空间的问题,即你必须扩大你家,才能够容纳的下一个超市。
对于内存来说也是一样的,减少了对栈的进出时间的开销,我们却扩大了主存的空间来容纳本来在栈里的函数,在C语言中实现这一功能是用内联函数inline来实现的。
这就是inline函数的作用!
0 0
- 内联函数
- 内联函数
- 内联函数
- 内联函数
- 内联函数
- 内联函数
- 内联函数
- 内联函数
- 函数内联
- 内联函数
- 内联函数
- 内联函数
- 内联函数
- 内联函数
- 内联函数
- 内联函数
- 内联函数
- 内联函数
- 把word文档转成pdf格式查看怎么做
- hdoj 1285 确定比赛名次 【拓扑排序】
- ios代码实现Autolayout(自动布局)的简单讲解
- [Spring Boot Debug]在 intellij idea 中无法编译 javad代码 -source 1.6 中不支持 diamond 运算符
- jQuery 的属性选择器
- 内联函数
- android中log的区别
- Unicode码和中文互转
- HDU 1800 Flying to the Mars(字典树水题)
- mac下安装mysql
- libnet资料整理
- 匿名函数的必包形式
- fprintf
- linux 版本中 i386/i686/x86-64/pcc 等... 的区别