C++中类的sizeof大小总结

一.前言:

关键字sizeof的作用是返回对象或类型占用的内存字节数,返回值是size_t。基本数据类型占用的字节数:

字节数 类型
1字节 bool 、char 
2字节 short 
4字节 int 、float、   long(32位)、指针(32位)
8字节 double、long long、指针(64位)、long(64位)

 对sizeof结果的一个重要影响因素是字节对齐。公式:有效对齐值=min(自身对齐值,设置对齐值),每个成员的起始地址得是有效对齐值的倍数,最后地址(占据空间)也是有效对齐值的倍数

二.类继承:

 1.虚函数、虚拟继承均占据4字节,其原因在于,内部均存在表指针指向虚函数表;

 2.类中,成员变量占据上表字节数,成员函数不占空间注:类至少占据1byte,留有地址待对象化时使用;空基类由编译器优化后,不占据内存大小;

 3.继承过程中,子类继承的父类的内存大小,虚拟继承仅占据表指针的4byte大小

如下例:

 

#pragma pack(4) //设置对齐值为4
class A {
public:
    void fun1();    // 0
    void fun2();    // 0
}; 

class B : public A{ // 0
public: 
    virtual fun3() = 0; // 4
    char b;
}; 

class C : virtual public B{ // 4
public:
    char c; 
}; 

// 纯方法类占据1byte
sizeof(A) = 1;
// 空基类优化,继承A占据0字节, 虚函数4byte与1byte字节对齐->8
sizeof(B) = 8; 
// 虚拟继承,包含表指针4byte,c:8,4,1 ->16
sizeof(C) = 16

 另外,可采用union节省内存

 union只分配域中最大域的空间,即double,所有域共存这个空间

union D {
    int d1;
    int d2;
    char d3;
    double d4;
};

sizeof(D) = 8 // 只分配域中最大域的空间,即double,所有域共存这个空间

 

posted @ 2021-12-03 22:30  行路人&  阅读(278)  评论(0编辑  收藏  举报