首页 > 代码库 > 第四章、function语意学

第四章、function语意学

情况一:非静态成员函数
C++的设计准则就是非静态成员函数至少和一般的非静态函数有相同的效率,因此非静态成员函数会被改写:
举个例子:float Point3d::magnitude3d()const {return x;}
①改写函数原型,添加一个额外的参数this到member function中,用于提供一个存取管道,使得class object得以掉用该函数。
float Point3d::magnitude3d(const Point3d *const this) {return x;}如果是非const的就不要最前面的const。
②对内部的调用改为this指针来存取:
{return this->x;}
③将成员函数重新写成一个外部函数,并且对其名称进行“mangling”处理,使它在程序中独一无二,这样重写或者重载都没问题。
注意对成员变量也会进行“mangling”处理,但是如果声明为extern "C"则会压抑“mangling”处理。

情况二:virtual Member Function
ptr->normal();就会转为(*ptr->vptr[0])(ptr);

情况三:静态成员函数
会被转为一般的nonmember函数调用,如ptr->normal();转化为normal_7Point3dSFV();原来可能为((Point3d *)0)->normal();但是现在没有了。
静态成员函数由于没有this指针,所以它有下面特性:
不能直接存取class中的nonstatic members,不能被声明为const、volatile或virtual,可以不需要类对象来调用。

2.Virtual Member Functions
虚函数会出现的可能:
继承base class声明的virtual Functions函数实体,正确拷贝到对应的slot;
添加slot,加入自己的virtual Functions。

多重继承下的虚函数
当重新赋值时,会发生指针偏移,从而指向正确的类型。此时派生类共享基类的虚指针

虚拟继承下的虚函数
此时派生类有自己的虚指针而不共享基类的虚指针。
最好不要在一个virtual base class中声明nonstatic data members,如果这样做会距离复杂的深渊越来越近。

3.函数的效能
对于函数:
void cross_product(){x=1;}
循环一百万次
for(int i=0;i<1000000;i++)cross_product();
内联函数无论优化与否,它的效率最高。因为它把循环提到外面,只计算一次。

4.指向Member Function的指针
貌似&Point::z();都不过VS2012的编译器。。

inline 函数
没有局部变量时,它会进行相应的扩展
inline int min(int i,int j){return i<j?i:j;}
如果调用:
int minval,val1=1024,val2=2048;
minval=min(val1,val2);//直接扩展为minval=val1<val2:val1:val2;
minval=min(1024,2048);//直接扩展为minval=1024;
minval=min(foo(),bar()+1);//扩展为int t1;int t2;minval=(t1=foo()),(t2=bar()+1),t1<t2?t1:t2;

有局部变量时:
inline int min(int i,int j){int minval=i<j?i:j; return minval;}
调用时,minval=min(val1,val2);
扩展
int __min_lv_minval;
minval=(__min_lv_minval=val1<val2?val1:val2,__min_lv_minval)
有几个局部变量就要扩展出几个局部变量