zoukankan      html  css  js  c++  java
  • [C++]对象模型总结

    在只有虚函数,或者只有虚继承的情况下,各个编译器中对C++的内存模型的实现是一样的。但同时存在虚函数和虚继承时,GCC与VC就会有差别。

    class Base//4
    {
        int a;
    };
    
    class Base1 :public Base//8
    {
        int a;
    };
    
    class Base2 : public Base//8
    {
        int a;
    };
    
    class Base3//4
    {
        virtual void funa(){}
    };
    
    //两个虚继承分别使用两个指针指向自己的虚基类,然后两个基类有2个int
    //应为使用了共同的虚基类,base的int只有一个,因此2*4+4+4+4=20
    //有多个虚继承的时候,就有多个虚指针
    class Derve:public virtual Base1,virtual Base2//20
    {
    
    };
    
    //base1有2个a,base2有两个a,就是基类的a有两份
    class Derve0:public  Base1, Base2//16 base1有2个a,base2有两个a,
    {
    
    };
    
    class Derve1:public Derve//20
    {
    
    };
    
    class Derve2:public Derve//24
    {
        int a;
    };
    
    //GCC当中 虚基类指针也会并入虚表中,VC不会,所有VC是24
    class Derve3:public Derve//24 -- 20
    {
        virtual void fun(){}
    };
    
    //多个虚继承共用一个虚表,一个虚指针
    class Derve4:public Base3//4
    {
        virtual void fun(){}
    };
    
    ////GCC当中 虚基类指针也会并入虚表中,所以只有一个虚指针,VC是12
    class Derve5:virtual public Base3//12 -- 8
    {
        int a;
    };
    
    class Derve6:public Derve3//24,VC28
    {
        virtual void fun(){}
        int a;
    };

    总结:

    1、多个虚函数共用一个虚表

    2、多个虚继承会建立多个虚表,因此会有多个虚指针

    3、在GCC中,如果同时有虚继承和虚函数,则指向虚基类的指针也会放在虚表中,就是每个虚继承只有一个虚指针;但多个虚继承仍然会有多个虚指针。

    4、在VC中,虚函数指针与虚基类指针不会合并,同时存在。如Derve3例子

  • 相关阅读:
    js解码
    node.js关于传送数据的二三事
    node下新建工程
    mysql配置
    mongodb配置及简单示例
    vue使用watch 观察路由变化,重新获取内容
    vue 封装方法
    ES6,import时如何正确使用花括号'{ }'
    css字体图标的制作
    vue实现淘宝商品详情页属性选择功能
  • 原文地址:https://www.cnblogs.com/iyjhabc/p/3288612.html
Copyright © 2011-2022 走看看