C++ vtable相关

(1) vtable的影响

     导致一个对象实例增大4个字节

 #include <cstdlib>
 #include <iostream>

 using namespace std;

 class A
 {
        int a;
 };

 class B
 {
        virtual void say()
        {
        }
     
        int b;
 };


 int main(int argc, char *argv[])
 {
      A a;
      B b;
   
      cout<<"A a : "<<sizeof(a)<<endl;
      cout<<"B b : "<<sizeof(b)<<endl;
   
      system("PAUSE");
      return EXIT_SUCCESS;
 }

 

     对含有虚表的对象实例不能采用memset操作
     虚表的生成时间,生成地点的影响,生成的地点受placement new影响

 #include <cstdlib>
#include <iostream>

using namespace std;

class A
{
      public:
             A()
             {
                    Show();
             }
            
             virtual void Show()
             {
                  cout<<"A"<<endl;
             }
};

class B : public A
{
      public:
             B()
             {
                 Show();
             }
            
             void Show()
             {
                  cout<<"B"<<endl;
             }
};

int main(int argc, char *argv[])
{
    B b;
   
    system("PAUSE");
    return EXIT_SUCCESS;
}
   

(2)用C语言模拟vtable

 

#include <cstdlib>
#include <iostream>

using namespace std;

void func1(int a)
{
     cout<<"func1"<<endl;
}

void func2(int b)
{
     cout<<"func2"<<endl;
}


struct vtable
{
       void (*func)(int v);
};

struct A
{
      struct vtable table;
      void Show(int v)
      {
           table.func(v);
      }
};

int main(int argc, char *argv[])
{
    A a, b;
    a.table.func = func1;
    b.table.func = func2;
    a.Show(1);
    b.Show(1);

    system("PAUSE");
    return EXIT_SUCCESS;
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值