zoukankan      html  css  js  c++  java
  • 关于类大小的小试验

    首先:

    #include <iostream>
    using namespace std;
    
    class A
    {
    public:
        void foo(){}
    };
    
    class B:public A
    {
    public:
        void foo(){}
    };
    
    class C:public A
    {
    public:
        void foo(){}
    };
    
    class D: public B,public C
    {
    public:
        void foo(){}
    };
    
    int main(int argc, char *argv[])
    {
        A a;
        B b;
        C c;
        D d;
        cout<<"A 的大小为: "<<sizeof(A)<<endl;
        cout<<"B 的大小为: "<<sizeof(B)<<endl;
        cout<<"C 的大小为: "<<sizeof(C)<<endl;
        cout<<"D 的大小为: "<<sizeof(D)<<endl;
        return 0;
    }
    /* output
    A 的大小为: 1
    B 的大小为: 1
    C 的大小为: 1
    D 的大小为: 1
    */

    然后是有虚函数的

    #include <iostream>
    using namespace std;
    
    class A
    {
    public:
        virtual void foo(){}
    };
    
    class B:public A
    {
    public:
        void foo(){}
    };
    
    class C:public A
    {
    public:
        void foo(){}
    };
    
    class D: public B,public C
    {
    public:
        void foo(){}
    };
    
    int main(int argc, char *argv[])
    {
        A a;
        B b;
        C c;
        D d;
        cout<<"A 的大小为: "<<sizeof(A)<<endl;
        cout<<"B 的大小为: "<<sizeof(B)<<endl;
        cout<<"C 的大小为: "<<sizeof(C)<<endl;
        cout<<"D 的大小为: "<<sizeof(D)<<endl;
        return 0;
    }
    /* output
    A 的大小为: 4
    B 的大小为: 4
    C 的大小为: 4
    D 的大小为: 8
    */

    由于A中foo为虚函数,因此A对象内有一个指向虚函数表的指针,即A对象大小为4。B和C均为单继承,所以也只有一个虚函数指针,也为4字节。D有继承自两个类,且两个类均有虚函数,故有两个虚函数表指针,所以为8字节。

    再者,看看虚继承的情况

    #include <iostream>
    using namespace std;
    
    class A
    {
    public:
        void foo(){}
    };
    
    class B:virtual public A
    {
    public:
        void foo(){}
    };
    
    class C:virtual public A
    {
    public:
        void foo(){}
    };
    
    class D: public B,public C
    {
    public:
        void foo(){}
    };
    
    int main(int argc, char *argv[])
    {
        A a;
        B b;
        C c;
        D d;
        cout<<"A 的大小为: "<<sizeof(A)<<endl;
        cout<<"B 的大小为: "<<sizeof(B)<<endl;
        cout<<"C 的大小为: "<<sizeof(C)<<endl;
        cout<<"D 的大小为: "<<sizeof(D)<<endl;
        return 0;
    }
    /* output
    A 的大小为: 1
    B 的大小为: 4
    C 的大小为: 4
    D 的大小为: 8
    */

    对虚继承的结果表示不理解,听说《深度探索C++对象模型》有介绍,要抽个时间看一看。

    以上试验均在VS2008环境下编译运行。

  • 相关阅读:
    【转】使用scipy进行层次聚类和k-means聚类
    spark wordcont Spark: sortBy和sortByKey函数详解
    scala akka通信机制
    redis AOF 和RDB
    java虚拟机学习
    快速排序,一个爱情故事-java版
    Caused by: java.io.IOException: Added a key not lexically larger than previous.
    java.io.IOException: No FileSystem for scheme: hdfs
    " java.lang.NoSuchFieldError: HBASE_CLIENT_PREFETCH_LIMIT
    用户活跃度分析
  • 原文地址:https://www.cnblogs.com/wnarutou/p/2732833.html
Copyright © 2011-2022 走看看