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

摘录侯杰《深度探索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)

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值