封装带来的负担?
假设在C语言中有如下代码:
typedef struct point3d
{
float x;
float y;
float z;
}Point3d;
void func()
{
Point3d *pd = get_a_point();
printf("(%g, %g, %g )",
}
如果转换为C++则我们会倾向于使用抽象数据类型来封装(ADT):
class Point3d;
ostream& oprator<<(ostream &os, const Point3d &pt);
class Point3d{
friend ostream& oprator<<(ostream &os, const Point3d &pt)
public:
Point3d(float x = 0, float y = 0, float z = 0): _x(x), _y(y), _z(z){}
float x(){return _x;}
float y(){return _y;}
float z(){return _z;}
//....etc
private:
float _x;
float _y;
float _z;
};
inline ostream& oprator<<(ostream &os, const Point3d &pt)
{
//os <<....
}
对这种转换来说,空间布局成本是没有增加的。因为3个数据成员直接包含在类中,而类中的成员函数却是独立于类存在的,每一个非inline成员函数仅会生成一个实例。不过inline成员函数会在每个模块上产生一个函数实例。
C++ 在布局和存取时间上主要的额外负担来自于virtual机制,包括
1. virtual function机制
2. virtual base class机制
待续。。。。