• 【C/C++】【类和对象】计算类所占的字节数


    空类

    空类

    #include <iostream>
    using namespace std;
    
    class Base
    {
        void f(){};
    };
    
    int main()
    {
        cout << sizeof(Base) << endl; //1
        return 0;
    }
    
    
    

    虚继承空类的类大小

    #include <iostream>
    #include <algorithm>
    #include <string.h>
    using namespace std;
    
    class Base
    {
        void f(){};
    };
    
    class Derived2 : public virtual Base
    {
        void d2();
    };
    
    
    int main()
    {
        cout << sizeof(Derived2) << endl; //8 64位下 有一个指向虚基类的指针
        return 0;
    }
    

    虚函数

    #include <iostream>
    #include <algorithm>
    #include <string.h>
    using namespace std;
    
    class Base
    {
        virtual void f(){};
    };
    
    class Derived1 : public Base
    {
        void d1();
    };
    
    class Derived2 : public Base
    {
        virtual void d2();
    };
    
    
    int main()
    {
        cout << sizeof(Base) << endl; //8 64位下 有一个指向虚函数表的指针
        cout << sizeof(Derived1) << endl; //8 64位下 有一个指向虚函数表的指针
        cout << sizeof(Derived2) << endl; //8 64位下 有一个指向虚函数表的指针
        return 0;
    }
    

    虚函数 + 虚继承

    #include <iostream>
    #include <algorithm>
    #include <string.h>
    using namespace std;
    
    class Base
    {
        virtual void f(){};
    };
    
    class Derived1 : public Base
    {
        void f1();
    };
    
    class Derived2 : public Base
    {
        virtual void f2();
    };
    
    class Derived3 : public virtual Base
    {
        virtual void f3();
    };
    
    int main()
    {
        cout << sizeof(Base) << endl; //8 64位下 有一个指向虚函数表的指针
        cout << sizeof(Derived1) << endl; //8 64位下 有一个指向虚函数表的指针
        cout << sizeof(Derived2) << endl; //8 64位下 有一个指向虚函数表的指针
        //每个虚继承的子类都有一个虚基类指针和虚基类表
        //虚继承 并且有虚函数 跟编译器有关系
        //vs是24(64位) 基类的虚函数表指针 自己的虚函数表指针 指向虚基类的指针
        //gcc是8(64位) ???有点疑惑
        cout << sizeof(Derived3) << endl; 
        return 0;
    }
    

    成员变量

    有成员变量的类

    #include <iostream>
    #include <algorithm>
    #include <string.h>
    using namespace std;
    
    class Base
    {
    public:
        int a;
        int b;
        virtual void f(){};
    };
    
    class Derived1 : public Base
    {
        void f1();
    };
    
    class Derived2 : public Base
    {
        virtual void f2();
    };
    
    
    
    int main()
    {
        //4 + 4 + 8
        cout << sizeof(Base) << endl; 
        cout << sizeof(Derived1) << endl; 
        cout << sizeof(Derived2) << endl; 
    
    
        return 0;
    }
    

    静态成员变量

    静态成员变量不属于类,计算类大小的时候不用考虑

    #include <iostream>
    #include <algorithm>
    #include <string.h>
    using namespace std;
    
    class Base
    {
    public:
        int a;
        int b;
        static int x;
        virtual void f(){};
    };
    
    class Derived1 : public Base
    {
        void f1();
    };
    
    class Derived2 : public Base
    {
        virtual void f2();
    };
    
    
    
    int main()
    {
        //4 + 4 + 8
        cout << sizeof(Base) << endl;
        cout << sizeof(Derived1) << endl;
        cout << sizeof(Derived2) << endl;
    
    
        return 0;
    }
    

    多重继承

    #include <iostream>
    #include <algorithm>
    #include <string.h>
    using namespace std;
    
    class Base
    {
        virtual void f() {};
    };
    
    class Derived1
    {
        virtual void f1() {};
    };
    
    class Derived2 : public Base, Derived1
    {
        virtual void f2() {};
    };
    
    
    int main()
    {
        cout << sizeof(Base) << endl; //8 64位下 有一个指向虚函数表的指针
        cout << sizeof(Derived1) << endl; //8 64位下 有一个指向虚函数表的指针
        cout << sizeof(Derived2) << endl; //16 64位下 多个虚函数表指针 ??? 
        return 0;
    }
    
  • 相关阅读:
    Mysql 批量插入数据的方法
    sql server 多行合并一行
    跨服务器多库多表查询
    OPENQUERY用法以及使用需要注意的地方
    C# 判断操作系统的位数
    rpc介绍
    JavaScript decodeURI()与decodeURIComponent() 使用与区别
    UNIX 时间戳 C#
    C# winform javascript 互调用
    oracle 实例名和服务名以及数据库名区别
  • 原文地址:https://www.cnblogs.com/Trevo/p/13560780.html
Copyright © 2020-2023  润新知