zoukankan      html  css  js  c++  java
  • 【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;
    }
    
  • 相关阅读:
    JOIN条件限制对结果记录的影响
    什么是linux?
    什么是操作系统?
    Internship settled!
    Python dict 调试技巧 —— 利用YAML存储dict内容
    c++ 异常处理
    C#可空类型
    C# 异常处理
    C#值类型与引用类型
    C# 类类型
  • 原文地址:https://www.cnblogs.com/Trevo/p/13560780.html
Copyright © 2011-2022 走看看