深度探索C++对象模型 关于对象的笔记
2010-07-28 21:29
471 查看
简单对象模型(Simple Object Model)
三个data members直接包含在每一个class object之中,就像C struct的情况一样。而member function 虽然含在class的声明之内,却不出现在object之中。每一个non-inline member function只会诞生一个函数实体。至于每一个“拥有零个或一个定义”的inline function则会在其每一个使用者(模块)身上产生一个函数实体。你即将看到:C++在布局以及存取时间上主要的额外负担是由virtual引起。包括:
virtual function: 用以支持一个有效率的“执行其绑定”。
virtual base class: 用以实现“多次出现在继承体系中的base class,有一个单一而被共享的实体。
实际上,类中的成员函数并不存放在”类的对象“中,而只有”指向成员函数的指针“才放在对象中。这么做可以避免“members有不同的类型,因而需要不同的存储空间”所导致的问题。
表格驱动对象模型(A Table-driven Object Model)
这种模型把所有与成员函数相关的信息抽取出来,放在一个data member table和一个member function table之中,类本身只包含指向这两个表格的指针。
虽然这个模型也没有实际应用于真正的C++编译器身上,但member function table 这个观念却成为支持virtual functions的一个有效方案。
C++对象模型(The C++ Object Model)
在这个模型中,数据成员被放置在每一个”类的实例“之中。而静态数据成员则被存放在所有的”类的实例“之外。静态和非静态的成员函数也被放在所有的”类的实例“之外。虚拟函数则以两个步骤支持之:
一:每一个class产生一堆指向virtual functions的指针,放在表格之中。这个表格被称为virtual table(vtbl)。
二:每一个class object被添加了一个指针,指向相关的virtual table。通常这个指针被称为vptr。vptr的设定和重置都有每一个class的construction, destruction 和 copy assignment 运算符自动完成。每一个class所关联的type_info object(用以支持runtime type identification, RTTI)也经由virtual table被指出来。通常是放在表格的第一个slot处。
一个派生类如何在本质上模塑其基类呢?在“简单对象模型”中,每一个基类可以被派生类对象的一个slot指出,该slot包含基类子对象的地址。这个体制的主要缺点是,因为间接性而导致空间和存取时间上的额外负担,优点则是类对象的大小不会因为基类的改变而受影响。
“指针类型”会教导编译器如何解释某个特定地址中的内存内容及其大小。
但是一个void*的指针,将涵盖怎样的地址呢?我们不知道!所以,我们不能够通过一个类型为void*的指针访问数据。所以,转型(cast)其实是一个编译器指令。大部分情况下它并不改变一个指针所含的真正地址,它只影响“被指出之内存的大小和其内容”的解释方式。
C++通过指针和引用来支持多态。这是因为它们并不引发内存中任何“与类型有关的内存委托操作”;会受到改变的只是它们所指向内存的“大小和内容解释方式”而已。如果是对象的话,派生类赋值给基类,则派生类的东西将会被切割,只保留与基类相关的东西。
三个data members直接包含在每一个class object之中,就像C struct的情况一样。而member function 虽然含在class的声明之内,却不出现在object之中。每一个non-inline member function只会诞生一个函数实体。至于每一个“拥有零个或一个定义”的inline function则会在其每一个使用者(模块)身上产生一个函数实体。你即将看到:C++在布局以及存取时间上主要的额外负担是由virtual引起。包括:
virtual function: 用以支持一个有效率的“执行其绑定”。
virtual base class: 用以实现“多次出现在继承体系中的base class,有一个单一而被共享的实体。
实际上,类中的成员函数并不存放在”类的对象“中,而只有”指向成员函数的指针“才放在对象中。这么做可以避免“members有不同的类型,因而需要不同的存储空间”所导致的问题。
表格驱动对象模型(A Table-driven Object Model)
这种模型把所有与成员函数相关的信息抽取出来,放在一个data member table和一个member function table之中,类本身只包含指向这两个表格的指针。
虽然这个模型也没有实际应用于真正的C++编译器身上,但member function table 这个观念却成为支持virtual functions的一个有效方案。
C++对象模型(The C++ Object Model)
在这个模型中,数据成员被放置在每一个”类的实例“之中。而静态数据成员则被存放在所有的”类的实例“之外。静态和非静态的成员函数也被放在所有的”类的实例“之外。虚拟函数则以两个步骤支持之:
一:每一个class产生一堆指向virtual functions的指针,放在表格之中。这个表格被称为virtual table(vtbl)。
二:每一个class object被添加了一个指针,指向相关的virtual table。通常这个指针被称为vptr。vptr的设定和重置都有每一个class的construction, destruction 和 copy assignment 运算符自动完成。每一个class所关联的type_info object(用以支持runtime type identification, RTTI)也经由virtual table被指出来。通常是放在表格的第一个slot处。
一个派生类如何在本质上模塑其基类呢?在“简单对象模型”中,每一个基类可以被派生类对象的一个slot指出,该slot包含基类子对象的地址。这个体制的主要缺点是,因为间接性而导致空间和存取时间上的额外负担,优点则是类对象的大小不会因为基类的改变而受影响。
“指针类型”会教导编译器如何解释某个特定地址中的内存内容及其大小。
但是一个void*的指针,将涵盖怎样的地址呢?我们不知道!所以,我们不能够通过一个类型为void*的指针访问数据。所以,转型(cast)其实是一个编译器指令。大部分情况下它并不改变一个指针所含的真正地址,它只影响“被指出之内存的大小和其内容”的解释方式。
C++通过指针和引用来支持多态。这是因为它们并不引发内存中任何“与类型有关的内存委托操作”;会受到改变的只是它们所指向内存的“大小和内容解释方式”而已。如果是对象的话,派生类赋值给基类,则派生类的东西将会被切割,只保留与基类相关的东西。
相关文章推荐
- 深入探索C++对象模型笔记之二 —— 关于对象(下)
- 关于模板编程的一个例子 来自深度探索c++对象模型
- [深度探索C++对象模型]关于成员初始化列表(member initiallization list)
- 【深度探索c++对象模型】关于对象
- 深度探索C++对象模型复习和学习 第一章 关于对象 (Object Lessons)
- 《深入探索C++对象模型》笔记之第一章关于对象
- 关于new和delete的编译器的内部实现---来自深度探索C++对象模型
- 深度探索C++对象模型--关于对象
- 深度探索C++对象模型 Function语意学笔记
- 深度探索C++对象模型 Data语意学笔记
- 深度探索c++对象模型 学习笔记 chapter2-1 default constructor
- 深度探索C++对象模型之C++对象模型笔记
- 深入探索C++对象模型笔记一 —— 关于对象(上)
- 深度探索C++对象模型之一 --- 关于对象
- 深度探索C++对象模型学习笔记——Function语意学
- 【深度探索C++对象模型】第一章 关于对象
- 读书笔记-深度探索C++对象模型-Chapter4
- 深度探索c++对象模型-阅读笔记
- 深度探索c++对象模型学习笔记
- Inside The C++ Object Model (深度探索C++对象模型) 第一讲 关于对象