1.加上封装后的布局成本
不同函数没有增加成本。
额外负担是由virtual引起的。
virtual function
virtual base class
1.1c++对象模型
class data member:static, nostatic
class member functions:static, nostatic, virtual
class Point{
public:
Point(float xval);
virtual ~Point();
float x() const;
static int PointCount();
protected:
virtual ostream& print(ostream &os) const;
float _x;
static int _point_count;
}
简单对象模型
一个object是一系列的slots,每一个slot指向一个members。Members按其声明次序,各被指定一个slot。每一个data member或function member都有自己的一个slot。
Point pt
--------------------------------------
| *-----|-------------------------->Point::Point(float)
--------------------------------------
| *-----|-------------------------->Point::~Point()
--------------------------------------
| *-----|-------------------------->float Point::x()
--------------------------------------
| *-----|-------------------------->int Point::PointCount()
--------------------------------------
| *-----|-------------------------->ostream& Point::print(ostream&);
--------------------------------------
| *-----|-------------------------->float Point::_x
--------------------------------------
| *-----|-------------------------->int Point::_point_count
--------------------------------------
表格驱动对象模型
将members抽出来,放在一个data member table和一个member function table之中,class object本身则内含指向这两个表格的指针
Point pt
member data table
-------------------------------------- -----------------------
| *-----|---------------------------------------------->| _x |
-------------------------------------- --------------------------- -----------------------
| *-----|--------->| | | _point_count |
-------------------------------------- --------------------------- -----------------------
| |
---------------------------
member function table
c++对象模型
nonstatic data members 被配置于每一个class object之内,
static data members则被存放在所有的class object之外
static和nonstatic function members也存放在所有的class object之外
virtual functions则以两个步骤支持:
1.每一个class产生出一堆指向virtual functions的指针,放在表格之中,这个表格被称为virtual table (vtbl)
2.每一个class object被添加一个指针,指向相关的virtual table。被称为vptr,vptr的设定和重置都由每一个class的constructor,destructor和copy assignment运算符自动完成。每一个class所关联的type_info object(用于支持runtime type identification,RTTI)也经由virtual table被指出来,通常是放在表格的第一个slot处。
1.2关键词所带来的差异
1.3对象差异
1.程序模型
2.抽象数据类型模型
3.面向对象模型
内存大小:
nonstatic data members的总和大小
由于alignment的需求而填补上去的空间。
加上为了支持virtual而由内部产生的任何额外负担
“指针类型”会教导编译器如何解释某个特定地址中的内存内容及其大小。
Bear b;
zooAnimal *pz = &b
Bear *pb = &b;
它们都指向Bear object的第一个byte,差别:pb所涵盖的地址包含整个Bear object,而pz所涵盖的地址只包含Bear object中的zooAnimal subobject。
除了ZooAnimal subobject中出现的members,你不能够使用pz来直接处理bear的任何members。唯一例外是通过virtual机制
pz的类型将在编译器决定一下两点:
固定的可用接口
该接口的Access level
对于virtual function,类型信息并不是维护与pz之中,而是维护于link之中,此link存在于object的vptr和vptr所指之virtual table之间。