2.5声明Inline函数 //完整程序还未打出
独立化程序:
之前的fibon_seq()返回fibonacci数列元素,其位置由用户而定。在最初的版本中,每次调用,它都会重新计算每一个数列元素,直到用户指定的元素为止。它也会检测用户所指的位置是否合理。我们可以将各个小工作分解成独立函数,以求简单化:
bool is_size_ok(int size)
{
const int max_size=1024;
if(size<=0||size>max_size)
{
cerr<<"oops:requested size is not supported:"
<<size<<"--cant fulfill request.\n";
return false;
}
return ture;
}
//计算fibonacci数列中的size个数
//并返回持有这些函数的静态容器的地址
const int max_size=1024;
static vector<int>elems;
if(!is_size_ok(size))
return o;
for(int ix=elems.size();ix<size;++ix)
{
if(ix==0||ix==1)
elems.push_back(1)
else elems.push_back(elems[ix-1]+elems[ix-2]);
}
return &elems;
}
//返回fibonacci数列中位置为pos的元素
//我们必须将该位置做减1调整,因为第一个元素位于位置0
//如果程序无法支持上述元素,便返回false
bool fibon_elem(int pos,int &elem)
{
const vector<int>*pseq=fibon_seq(pos);
if(!pseq)
{
elem=0;
return false;
}
elem=(*pseq)[pos-1];
return true;
}
inline函数的作用
将有效位置的检验操作抽取为is_size_ok(),再将计算fibonacci数列的程序抽取为fibon_seq(),从此fibon_elem()的实现变得更加单纯理解。这个函数也可以为其他应用函数所利用。但是,先前的函数fibon_elem()只需要调用一个函数便完成人所有运算,如今必须要使用三个函数,这是它的缺点。这负担是否很重要呢?这跟当时的情形有关。如果执行力不够,就需要将三个函数重新组合成为一个。然而c++还提供了另一个解决方法就是将这些函数声明为inline函数,编译器可以再每个函数的调用点上,将函数的内容展开。面对一个inline函数,编译器可以将函数的调用操作改成以一份代码副本代替。这将使我们获得性能改善,其结果等于是把三个函数写入fibon_elem()内,但依然维持三个独立的运算单元。
inline函数的声明:
只要在函数的前面加上关键字inline,便可以将函数定义为inline。
//OK,现在fibon_elem()成了inline函数
inline bool fibon_elem(int pos,int &elem)
将函数定义为inline,只是对编译器提出的一种要求。编译器是否具有执行能力,需视编译器而定。一般而言,最适合声明为Inline函数,和fibon_elem()以及is_size_ok()一样:体积小,常被调用,所从事的计算不复杂。
inline的定义常常被放在头文件中,编译器必须在它被调用的时候展开,所以这个时候的定义必须是有效的。
完整程序: