C++对象模型---第 1 章 关于对象

1. 使用class封装之后的布局成本:
        (1)class并没有增加成本,data members直接内含在每一个class object之中,就像C struct一样。而member functions虽然被包含在class的声明之内,但是不出现在Object之中。每一个non-inline function 只会产生一个函数实体。至于inline function则会在每一个调用使用的地方产生一个函数实体(在调用点展开函数体)。
        (2)class在布局以及存取时间上主要的额外负担是由virtual 引起,包括:
                       a. virtual function 机制用以支持一个有效率的“执行期绑定(runtime binding)”。
                       b. virtual base class 用以实现“多次出现在继承体系中的 base class ,有一个单一的被共享的实体”。
                       c. 发生在“一个 derived class 和其第二或后继之 base class 的转换”之间。
 
2. C++对象模型:
        (1)类的模型结构:nonstatic function member 和 static function member 在类外。static data member 在类外。nonstatic data member 在类内。
        (2)虚表:每个class 产生出一堆指向虚函数的指针,放在表格中,这个表格称为虚表(vtbl)。
        (3)虚基类表:每个drive class 产生一堆指向虚基类的指针,放在表格中,这个表格称为虚基类表(btbl)。但是会产生存取时间上的额外负担
        (3)每个class关联的 type_info object (用于RTTI)也由虚表指出来,通常放在表格第一个slot中。
        (4)vptr:每个class object 安插一个指针,指向相关的vtbl,称为vptr。
        (5)bptr:每个class object 安插一个指针,指向相关的btbl,称为bptr。
    
 
3. class object 需要多少内存:
            (1)nonstatic data members的总和大小。
            (2)加上由于alignment(校验)的需求而padding(填补)上去的空间。
            (3)加上为了支持 virtual 而由内部产生的额外负担。
 
4. 指针类型:
                指针类型告诉编译器如何解释某个特定地址中的内存及其大小。
                dynamic_cast(指针转型),不会改变指针指向的真实地址,只会影响编译器对于“被指向内存的大小和内容”的解释方式。
 
 5. C++ 以下列方法支持多态:
            (1)经由一组隐含的转化操作。例如把一个 derived class 指针转换为一个指向其 public base type的指针:
                        baser *p = new driver();
            (2)经由 virtual function 机制:
                        p->rotate();
            (3)经由dynamic_cast和typied运算符:
                        driver *dd = dynamic_cast<driver *>( p );
原文地址:https://www.cnblogs.com/ladawn/p/8205032.html