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环境下编译运行。

  • 相关阅读:
    CRM安装过程问题总结
    SQL Server Active Directory Helper 无法启动
    CRM导出Excel记录的最大数量
    CRM名词解释
    CRM根据不同的角色过滤视图
    asp.net C# webservice安全性方案
    利用MSCRM4.0 Trace功能跟踪详细错误信息
    事件1058处理过程,处理组策略失败.
    在 Windows Server 2003 中配置网络负载平衡
    对比SQL中简单嵌套查询与非嵌套查询的异同
  • 原文地址:https://www.cnblogs.com/wnarutou/p/2732833.html
Copyright © 2011-2022 走看看