C++对象模型读书笔记-- 虚表 virtual table

来源:互联网 发布:linux home目录不见了 编辑:程序博客网 时间:2024/06/08 16:29

摘录侯杰《深度探索C++对象模型》 第一章---关于对象 P13

1. 虚表

函数定义

X foobar()

{

   X xx;

   X* px = new X;

 

   //foo() 是一个virtual function

   xx.foo();

   px->foo();

 

   delete px;

   delete xx;

}

 

这个函数在内部的转化为虚拟C++代码:

void foobar(X& _result)

{

    //构造_result

    //用来取代 local xx

    _result.X::X();

    //扩展X* px = new X;

    px = _new (sizeof(x));

    if(px != 0)

        px->X::X();

 

    //扩展xx.foo, 但不使用virtual 机制

    //以_result取代xx

    foo(&result);

  

    //使用virtual 机制扩展px->foo()

    (*px->vtbl[2]) (px);

 

    //扩展delete px;

    if( px!=0)

    {

        (*px->vtbl[1]) (px);    // destructor

        _delete(px);

     }

    //无须使用 name return statement

    // 无须摧毁 local object xx

    return;

}

 

这个例子,充分的说明了虚表(virtual Table)的使用。 每个class object都有一个虚表指针。 虚表的不同行对应了虚函数,析构函数。

 

 

 

2. 需要多少内存才表表现一个class object

a)  其nonstatic data member

b)  加上任何由于alignment的需求,而补齐的空间(字节对齐)。 32位机,通常alignment为4bytes 

c) 加上为了支持virtual而内部产生的任何额外负担(overhead)

 

 

 

0 0