非原创,在学习
1 关于对象(Object Lessons)
这里最开始从C语言的结构体引出C++中的”抽象数据类型(ADT)“。
而加上封装之后,布局成本没有增加,三个data member直接内含在每一个class object之中,就像
C struct的情况一样,而member functions虽然含在class的声明之内,却不出现在object 之中。每
一个non-inline member function只会诞生一个函数实体。
至于每一个“拥有零个或一个定义”的inline function 则会在其每一个使用者(模块)身上产生一个函
数实体Point3d支持封装性质,这一点并未带给它任何空间或执行期的不良回应。你即将看到,
C++在布局以及存取时间上主要的额外负担是由virtual 引起,包括:
- virtual function机制用以支持一个有效率的“执行期绑定”( runtime binding) .
- virtual base class用以实现“多次出现在继承体系中的 baseclass,有一个单一而被共享的实体”。
这里主要在说C++的内存结构。
1.1 C++对象模式(The C++ Object Model)
在c++中有两种成员变量:静态的数据成员(static)、非静态的数据成员(nonstatic);
有三种成员函数:静态的函数(static)、非静态的函数(nonstatic)、虚函数(virtual)
#include <iostream>
using std::ostream;
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; // 静态变量
} ;
int main(int argc, char** argv) {
system("pause");
return 0;
}
简单对象模型(A Simple Object Model)
在这个简单模型中,一个object是一系列的slots,每一个slot指向一个members。Members按其声
明次序,各被指定一个slot。每一个data member或function member都有自己的一个slot,如图所
示:
虽然这个模型并没有被应用于实际产品上,不过关于索引或slot数目的观念,倒是被应用到C++的
“指向成员的指针”( pointer-to-member)观念之中,
表格驱动对象模型(A Table-driven Object Model)
为了对所有classes 的所有objects都有一致的表达方式,另一种对象模型是把所有与members相关
的信息抽出来,放在一个data member table和一个member function table 之中,class object本
身则内含指向这两个表格的指针。Member function table是一系列的 slots,每一个slot 指出一个
member function;Data member table 则直接含有 data本身,如图所示:
虽然这个模型也没有实际应用于真正的 C++编译器身上,但member function table这个观念却成
为支持virtual functions的一个有效方案。
C++对象模型(The C++ Object Model)
在此模型中,Nonstatic datamembers被配置于每一个class object之内,static data members则被
存放在所有的 class object之外.Static和 nonstatic function members也被放在所有的 classobject之
外.Virtual functions 则以两个步骤支持之:
1.每一个class产生出一堆指向virtual functions的指针,放在表格之中.这个表格被称为virtue!
table ( vtbl) .
2.每一个class objcct被添加了一个指针,指向相关的 virtual table。通常这个指针被称为 pte. vptr
的设定( setting)和重置( resetting)都由每一个cisss的 coris:ructar . destructor 和 copy
assignment运算符自动完成(我籽在第5章讨论)。每个class所关联的 type_info object(用以支
持runtime type identification,RTTI)也经由virtual table被指出来,通常是放在表格的第一个slot
处。
详见:c++对象模型_StudyWinter的博客-CSDN博客
上图明C++对象模型如何应用于前面所说的 Point class身上.这个模型的主要优点在于它的空间
和存取时间的效率;主要缺点则是,如果应用程序代码本身未曾改变,但所用到的 class objects 的
nonstatic data members有所修改(可能是增加、移除或更改),那么那些应用程序代码同样得重
新编译.关于这点,前述的双表格模型就提供了较大的弹性,因为它多提供了-一层间接性,不过
它也因此付出空间和执行效率两方面的代价就是了。