c++的几种对象模型
2016-08-11 22:03
183 查看
简单对象模型(Asimple ObjectModel):
这个模型的结构比较简单,他可能是为了尽可能降低C++编译器的设计复杂度而开发出来的,赔上的则是空间和执行期的效率。在这个模型中,member并不是直接放在object中。只有指向member的pointer。 这么做可以避免不同的数据类型而需要不同的数据空间。member的寻址是对象的基址加上slot的索引值。
表格驱动对象模型(Table-dirvenobject model):
class object中存在两个pointer,一个指向data member table,另一个指向function member table,每一个table中含有一系列的slot,每个slot指向一个member,这样做是为了对所有class的object都有一种表达
c++对象模型(the c++ Object model):
在此模型中,Nonstatic data member被配置于每一个class object之内,static data member,static and nonstatic function member则被存放在个别的class object之外。Virtual functions则以两个步骤来实现:
1.每一个class产生一系列指向virtual function的指针,存放在virtual table中
2.每个object中安插一个指向virtual table的pointer,named Vptr。vptr的设定和重置都由一个constructor和destructor和copy assigment运算符自动完成,注意是自动完成,不用为此专门增加代码.每一个class所关联的type_info object(用以支持RTTI) 被放在表格的第一个slot。
这个模型的主要优点在于它的空间和存取时间的效率,缺点是,如果程序代码本身未曾改变,但所用到的class object的非静态成员有所修改,那么那些程序代码同样得重新编译
RTTI(run-time type identification),通过运行时类型信息程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型。RTTI提供了以下两个非常有用的操作符:
(1)typeid操作符,返回指针和引用所指的实际类型。
(2)dynamic_cast操作符,将基类类型的指针或引用安全地转换为派生类型的指针或引用。
这个模型的结构比较简单,他可能是为了尽可能降低C++编译器的设计复杂度而开发出来的,赔上的则是空间和执行期的效率。在这个模型中,member并不是直接放在object中。只有指向member的pointer。 这么做可以避免不同的数据类型而需要不同的数据空间。member的寻址是对象的基址加上slot的索引值。
表格驱动对象模型(Table-dirvenobject model):
class object中存在两个pointer,一个指向data member table,另一个指向function member table,每一个table中含有一系列的slot,每个slot指向一个member,这样做是为了对所有class的object都有一种表达
c++对象模型(the c++ Object model):
在此模型中,Nonstatic data member被配置于每一个class object之内,static data member,static and nonstatic function member则被存放在个别的class object之外。Virtual functions则以两个步骤来实现:
1.每一个class产生一系列指向virtual function的指针,存放在virtual table中
2.每个object中安插一个指向virtual table的pointer,named Vptr。vptr的设定和重置都由一个constructor和destructor和copy assigment运算符自动完成,注意是自动完成,不用为此专门增加代码.每一个class所关联的type_info object(用以支持RTTI) 被放在表格的第一个slot。
这个模型的主要优点在于它的空间和存取时间的效率,缺点是,如果程序代码本身未曾改变,但所用到的class object的非静态成员有所修改,那么那些程序代码同样得重新编译
RTTI(run-time type identification),通过运行时类型信息程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型。RTTI提供了以下两个非常有用的操作符:
(1)typeid操作符,返回指针和引用所指的实际类型。
(2)dynamic_cast操作符,将基类类型的指针或引用安全地转换为派生类型的指针或引用。
相关文章推荐
- C++ 重载运算符
- 洛谷 P2278 [03湖南] 操作系统
- 关于“应用程序无法启动,因为应用程序的并行配置不正确”
- c语言中register类型的变量
- C++ Socket 一个服务器 多个客户端 (阻塞式)
- c++之基础知识(2)重载 操作符重载
- 多线段覆盖 求覆盖区间的总和
- Effective C++_Item16笔记
- Effective C++笔记(1)
- C++中的虚基类
- 【动态规划】LCS算法:求两字符串最大公共子序列/删除字符使成为回文串
- 华为上机题汇总(六)
- c++ string类实现
- C语言有符号数与无符号数之间的转换
- C++11 多线程
- C++ 模板函数
- C++ const
- c/c++中各数据类型在内存中的存储方式
- 【滤波器学习笔记】一阶RC低通滤波
- c语言的精髓4