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;
    }
    
  • 相关阅读:
    java拦截器与过滤器打印请求url与参数
    mybatis学习笔记(六)使用generator生成mybatis基础配置代码和目录结构
    【IDEA】IDEA创建Maven的Web项目并运行以及打包
    【环境变量】Linux 下三种方式设置环境变量与获取环境变量
    【Git】GitHub的SSH提交配置[
    spring配置redis注解缓存
    【查看linux配置】查看linux系统常用的命令,Linux查看系统配置常用命令
    Redis集群
    linux中wget 、apt-get、yum rpm区别
    spring+redis的集成,redis做缓存
  • 原文地址:https://www.cnblogs.com/Trevo/p/13560780.html
Copyright © 2011-2022 走看看