zoukankan      html  css  js  c++  java
  • C++基础--class的大小

    在这里列出了空类,类有函数,值,没有函数的大小,注意Class是默认字节对齐

    #include "stdafx.h"
    #include <stdio.h>
    #include <stdlib.h>
    #include <string>
    using namespace std;
    
    #include <stdio.h>
    
    class x
    {
    
    };
    
    class cx
    {
    public:
        cx()
        {
    
        }
        ~cx()
        {
    
        }
    };
    
    class cxHasVirtual
    {
    public:
        cxHasVirtual()
        {
    
        }
        virtual ~cxHasVirtual()
        {
    
        }
    };
    
    class cxHasVirFunc
    {
    public:
        cxHasVirFunc()
        {
    
        }
        virtual ~cxHasVirFunc()
        {
    
        }
    
        virtual int setA()
        {
            int a = 5;
        }
    
    };
    
    class cxHasVal
    {
    public:
        cxHasVal()
        {
    
        }
        ~cxHasVal()
        {
    
        }
        int a;
        char y;
    
    };
    
    
    
    class cxHasValFunc
    {
    public:
        cxHasValFunc()
        {
    
        }
    
        ~cxHasValFunc()
        {
    
        }
        int a;
        char y;
        
        int getASize()
        {
            return sizeof(a);
        }
        void setA()
        {
            a = 5;
        }
    };
    
    int main()
    {
        x emptyX;
        int emptySize = sizeof(x);
        printf("size of empty class is %d
    
    ", emptySize);
    
        cx *classx = new cx();
        int clsizePt = sizeof(classx);
        int clsize = sizeof(cx);
        printf("size of class point is %d
    ", clsizePt);
        printf("size of class is %d
    
    ", clsize);
    
        cxHasVirtual *classVirtual = new cxHasVirtual();
        int clsizeVirtualPt = sizeof(classVirtual);
        int clsizeVirtual = sizeof(cxHasVirtual); 
        int clsizeVirFunc = sizeof(cxHasVirFunc);
        printf("size of class point has virtual is %d
    ", clsizeVirtualPt);
        printf("size of class has virtual is %d
    
    ", clsizeVirtual);
        printf("size of class has virtual destruct and fun is %d
    
    ", clsizeVirFunc);
        
    
        cxHasVal *hasVal = new cxHasVal();
        hasVal->a = 12;
        int hasValSize = sizeof(hasVal);
        int rVal = sizeof(cxHasVal);
        printf("size of class Point has val is %d
    ", hasValSize);
        printf("size of class has val is %d
    
    ", rVal);
    
        cxHasValFunc *hasValFunc = new cxHasValFunc();
        int hasValFuncSize = sizeof(hasValFunc);
        int rValFunc = sizeof(cxHasValFunc);
        printf("size of class Point has val is %d
    ", hasValFuncSize);
        printf("size of class has val Func is %d
    
    ", rValFunc);
    
        return 0;
    }

      运行结果:

     结论:1.空类的大小和含有构造和析构函数的类的大小为1个字节;

       2.New的class的大小为指针所占用的内存,为4,与类的大小以及是否含有变量和函数无关;

       3. 含有虚函数的类,由于虚函数需要建立一张虚函数表,指针指向虚函数表,而指针的大小为4,所以含有虚函数的类大小增加4个字节;

       4. 含有函数和变量的类的大小为变量的大小的集合,这里变量为int和char, 由于字节对齐,大小为8;

       5.类的大小与函数无关

  • 相关阅读:
    什么是知行动手实验室?
    SpringBoot Admin2.0 集成 Java 诊断神器 Arthas 实践
    一文读懂容器存储接口 CSI
    AI 事件驱动场景 Serverless 实践
    一不小心,它成为了 GitHub Alibaba Group 下 Star 最多的开源项目
    5G 和云原生时代的技术下半场,视频化是最大最新的确定性
    基于 RocketMQ Prometheus Exporter 打造定制化 DevOps 平台
    Knative 基于流量的灰度发布和自动弹性实践
    阿里的 RocketMQ 如何让双十一峰值之下 0 故障?
    阿里巴巴开源容器镜像加速技术
  • 原文地址:https://www.cnblogs.com/anlia/p/9083652.html
Copyright © 2011-2022 走看看