突然看到CPrimer中讲到,对于vector的一个循环,调用语句:(示例代码i=v.begin()不是很规范,虽然不会出错,客官请将就着看)
对于size()的调用,其实是内联。想到以前貌是看《高质量C/C编程》时,提过,在循环时,可以采用变量保存v.size()的,以减少每个循环的调用开支。于是决定一搜,顺便总结之。
1、inline的引出
考虑下列min()函数(例子来自CPrimer第三版303页)
intmin(intv1,intv2)
{
return(v1<v2<<v1:v2);
}
为这样的小操作定义一个函数的好处是:
a.如果一段代码包含min()的调用,那阅读这样的代码并解释其含义比读一个条件操作符的实例,可读性会强很多。
b.改变一个局部化的实现比更改一个应用中的300个出现要容易得多
c.语义是统一的,每个测试都能保证相同的方式实现
d.函数可以被重用,不必为其他的应用重写代码
不过,将min()写成函数有一个严重的缺点:调用函数比直接计算条件操作符要慢很多。那怎么能兼顾以上优点和效率呢?C提供的解决方案为inline(内联)函数
2、inline的原理:代码替代
在程序编译时,编译器将程序中出现的内联函数的调用表达式用内联函数的函数体来进行替代。
例如,如果一个函数被指定为inline 函数则它将在程序中每个调用点上被内联地展开例如
intminVal2=min(i,j);
在编译时被展开为
intminVal2=i<j<<i:j;
则把min()写成函数的额外执行开销从而被消除了。
3、inline的使用
让一个函数成为内联函数,隐式的为在类里定义函数,显式的则是在函数前加上inline关键字说明。
C有三种方式实现内联函数:
1. 将函数的定义写在类定义的内部;
2. 在类定义内部的函数声明上用inline显式指定;
3. 在类定义体外部的函数实现上用inline显式指定;
#include<iostream>
usingnamespacestd;
classSample
{
public:
voidinline01(){cout<<"";}
inlinecharinline02()const;
intinline03();
};
charSample::inline02()const
{
return'w';
}
inlineintinline03()
{
return0;
}
4、使用inline的一些注意事项
a.从inline的原理,我们可以看出,inline的原理,是用空间换取时间的做法,是以代码膨胀(复制)为代价,仅仅省去了函数调用的开销,从而提高函数的执行效率。内联函数如果执行函数体内代码的时间,相比于函数调用的开销较大,那么效率的收获会很少。所以,如果函数体代码过长或者函数体重有循环语句,if语句或switch语句或递归时,不宜用内联
b.关键字inline 必须与函数定义体放在一起才能使函数成为内联,仅将inline 放在函数声明前面不起任何作用。内联函数调用前必须声明。《高质量C/C编程》里一个例子。
inlinevoidFoo(intx,inty);//inline仅与函数声明放在一起
voidFoo(intx,inty)
{
...
}
以上代码不能成为内联函数,而以下则可以
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-34429-1.html
千式苏音
含盐
祖宗留给我们的江海疆土绝不容侵犯