class的大小

Posted Anlia

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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\\n\\n", emptySize);

    cx *classx = new cx();
    int clsizePt = sizeof(classx);
    int clsize = sizeof(cx);
    printf("size of class point is %d\\n", clsizePt);
    printf("size of class is %d\\n\\n", 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\\n", clsizeVirtualPt);
    printf("size of class has virtual is %d\\n\\n", clsizeVirtual);
    printf("size of class has virtual destruct and fun is %d\\n\\n", 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\\n", hasValSize);
    printf("size of class has val is %d\\n\\n", rVal);

    cxHasValFunc *hasValFunc = new cxHasValFunc();
    int hasValFuncSize = sizeof(hasValFunc);
    int rValFunc = sizeof(cxHasValFunc);
    printf("size of class Point has val is %d\\n", hasValFuncSize);
    printf("size of class has val Func is %d\\n\\n", rValFunc);

    return 0;
}

 

  运行结果:

 

 

 

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

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

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

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

   5.类的大小与函数无关

 

以上是关于class的大小的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 快速开发 代码块

解决spring-boot启动中碰到的问题:Cannot determine embedded database driver class for database type NONE(转)(代码片段

Xcode 快速开发 代码块 快捷键

14.VisualVM使用详解15.VisualVM堆查看器使用的内存不足19.class文件--文件结构--魔数20.文件结构--常量池21.文件结构访问标志(2个字节)22.类加载机制概(代码片段

java 反射代码片段

从JVM的角度看JAVA代码--代码优化