class字节计算

1、类的大小

类的sizeof()大小一般是类中的所有成员的sizeof()大小之和,这个就不用多说。确切的说,用sizeof运算符对一个类型名操作,得到的是具有该类型实体的大小。注意:类只是一个类型定义,它本身是没有大小可言的。

对象大小= vptr(类中定义了多个virtual函数,仍然为占用4个字节) + 所有非静态数据成员大小 + Aligin字节大小(依赖于不同的编译器)。

2、使用sizeof()计算类大小的一些基本原则:

(1)类的大小为类的非静态成员数据的类型大小之和,也就是说静态成员数据不作考虑;

(2)类的字节大小也遵守类似struct字节对齐的,调整规则;(参考5分钟搞定内存字节对齐)

(3)成员函数都是不会被计算的;

(4)如果是子类,那么父类中的成员也会被计算,因为构造函数先初始化父类,所以在计算字节对齐时,先计算父类的字节,按父类定义的数据成员的最宽字节数来为子类进行字节对齐,类似struct;

(5)虚函数由于要维护虚函数表,所以要占据一个指针大小,也就是4字节。

总结即:一个类中,虚函数、成员函数(包括静态与非静态)和静态数据成员都不占用类对象的存储空间。

pragma pack(n),为n字节对齐方式

使用规则如下:
1、数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的对齐按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行。
2、结构(或联合)的整体对齐规则:在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行。

测试代码如下:

#include<iostream>  

using namespace std;

//1、空类  
class empty_class
{

};

class empty_class1
{
public:
    empty_class1();
    ~empty_class1();
};

//2、虚函数  
class virtual_class
{
public:
    virtual_class();
    virtual ~virtual_class();
};

class example1_class
{
private:
    char a;
    double b;
};

class example2_class
{
public:
    example2_class();
    virtual ~example2_class();   //若去掉virtual关键字,则sizeof(example2_class)结果为4  
    int count(int num){ a = num; } //普通成员函数,为各实例公有,不归入sizeof统计  
private:
    double a;
};

class example3_class
{
public:
    example3_class();
    ~example3_class();   //若去掉virtual关键字,则sizeof(example2_class)结果为4  
    virtual int count(int num){ a = num; }  //虚函数不记入sizeof统计  
    virtual void cc(){ int c = 0; }
private:
    int a;
};

class example4_class
{
public:
    virtual int count(int num){} 
      //<span style = "font-family: Arial;"> < / span>                  //虚函数记入sizeof统计  

private:
            int a;
};

class example5_class
{
private:
    float a;
    //double b;  
    //int c;  
public:
    void fun(void);//不记入sizeof统计  
};

class example6_class    //该类里面包含一个函数和一个虚函数,取最大的占用4个字节  
{
    void func_1() {}
    void func_2() {}
    virtual void func_3() {}
    virtual void func_4() {}
};

//3、继承  
class inherit_class :public example2_class
{
public:
    inherit_class();
    ~inherit_class();
private:
    char ch;
    char *pch;
    const float f;
    static double d; //不计入sizeof计算  
};

int main()
{
    cout << "sizeof(empty_class) = " << sizeof(empty_class) << endl;
    cout << "sizeof(empty_class) = " << sizeof(empty_class1) << " with constructer and deconstructer" << endl;
    cout << "sizeof(virtual_class) = " << sizeof(virtual_class) << " with virtual" << endl;
    cout << "sizeof(example1_class) = " << sizeof(example1_class) << endl;
    cout << "sizeof(example2_class) = " << sizeof(example2_class) << endl;
    cout << "sizeof(example3_class) = " << sizeof(example3_class) << endl;
    cout << "sizeof(example4_class) = " << sizeof(example4_class) << endl;
    cout << "sizeof(example5_class) = " << sizeof(example5_class) << endl;
    cout << "sizeof(example6_class) = " << sizeof(example6_class) << endl;
    cout << "sizeof(inherit_class) = " << sizeof(inherit_class) << " with inherit" << endl;

    system("pause");
    return 0;
}

输出如下:
这里写图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值