首页后端开发其他后端知识C++类的大小怎么算,方法是什么

C++类的大小怎么算,方法是什么

时间2024-03-28 07:38:03发布访客分类其他后端知识浏览352
导读:关于“C++类的大小怎么算,方法是什么”的知识点有一些人不是很理解,对此小编给大家总结了相关内容,文中的内容简单清晰,易于学习与理解,具有一定的参考学习价值,希望能对大家有所帮助,接下来就跟随小编一起学习一下“C++类的大小怎么算,方法是什...
关于“C++类的大小怎么算,方法是什么”的知识点有一些人不是很理解,对此小编给大家总结了相关内容,文中的内容简单清晰,易于学习与理解,具有一定的参考学习价值,希望能对大家有所帮助,接下来就跟随小编一起学习一下“C++类的大小怎么算,方法是什么”吧。





1、C++结构体和类的关系

为什么讲C++类的大小要提到结构体呢,因为可能很多和我一样的学子,接触过C语言的结构体对齐,但不明白类的大小怎么计算,这其中都要用到内存对齐的概念,对于内存对齐的概念之前已经说过了,可以参考这篇博客:C++结构体字节对齐和共用体大小 明白结构体的内存大小计算后,就要明白类和结构体的关系:

在C++中,结构体和类的唯一区别就是: 结构体和类具有不同的默认访问控制属性。

  类中,对于未指定访问控制属性的成员,其访问控制属性为私有类型(private)。

  结构体中,对于未指定任何访问控制属性的成员,其访问控制属性为公有类型(public)。

所以结构体的大小和类的大小是一样的,在C++中,结构体也可以实现实现继承和多态(可能很惊讶,可以去看看这篇博文:C++结构体与类的区别详情,还要明确,静态成员变量和成员函数所占用的空间肯定不是结构体或类的空间。还有就是空的类的大小是1字节,以方便类进行实例化。

代码进行验证:

#includeusing namespace std;


struct Node {


}
    ;


class Test{


}
    ;


int main () {
    
    cout  "sizeof(struct Node) = "  sizeof(Node)  endl;
     cout  "sizeof(class Test) ="  sizeof(Test)  endl;
     system("pause");
     return 0;
 }
     

代码运行结果为:

2、继承类的大小

继承允许我们依据另一个类来定义一个类,会把一个类的成员大小都继承下来,所以继承了的派生类大小一定要考虑基类的大小,首先考虑的最大对齐数,派生类的最大对齐数要考虑基类的最大对齐数。

下面以实际代码进行说明:

#includeusing namespace std;



class Base{

public:
    void func() {
  //成员函数不占用类的空间大小

    }
    
private:
    static int m_val1;
     // 静态成员不占用类的空间
    int m_valInt;
    
    char m_valChar;
    
    double m_valDouble;

}
    ;


class Son:public Base{

public:
    static int func() {
     //静态成员函数也不占用内存空间
        return 0;

    }
    
private:
    int m_sonValint;

}
    ;



int main () {
    
    cout  "sizeof(Base) = "  sizeof(Base)  endl;
     cout  "sizeof(Son) = "  sizeof(Son)  endl;
     system("pause");
     return 0;
 }
     

代码运行结果为:

可以明确,静态成员变量和成员函数所占用的空间类的空间,所以Base类的最大对齐数为double类型的大小(8字节),按照顺序存储,

Base类的大小计算应该为:

sizeof(Base)= 4 + 1 + 3(浪费) + 8 = 16字节

Son类继承了Base类,它的最大对齐数也就是8字节,

所以Son类的大小计算应该为:

sizeof(Son) = 4 + 1 + 3(浪费) + 8 + 8 = 24字节

注意类的也要考虑存储顺序,如果把Base类中的m_valChar放到m_valDouble后面,

Base类的大小计算就变成了:

sizeof(Base)= 4 + 4(浪费)+ 8 + 1 + 7(浪费)= 24字节

Son类的大小就算就变成了:

sizeof(Son)= 4 + 4(浪费)+ 8 + 1 + 3(浪费) + 4= 24字节

由此可以推算出多继承类的大小计算,菱形继承也是一样,都会继承基类的内存,尤其注意虚继承的情况,虚继承只是避免了菱形继承出现的二义性,但不是不继承,

如以下代码:

#includeusing namespace std;


class Base{

public:
    void func() {
  //成员函数不占用类的空间大小

    }
    
public:
    double m_valDouble;

}
    ;


class Son1:virtual public Base{
}
    ;
 //虚继承
class Son2:virtual public Base{
}
    ;
 //虚继承
class GrandSon:public Son1,public Son2{
}
    ;


int main () {
    
   
    cout  "sizeof(GrandSon) = "  sizeof(GrandSon)  endl;
     GrandSon gs;
     // gs.m_valDouble = 10;
     //如果不是虚继承就会出现二义性 system("pause");
     return 0;
 }
     

代码运行结果为:

上述GrandSon的依旧为16字节,因为它从Son1继承来了一份,又从Son2继承来了一份,所以,虚继承只是避免了访问的二义性,也可见菱形继承会对内存空间造成浪费 。

3、多态类的大小

多态类唯一的区别就是计算类大小要考虑到虚寒表指针的大小,指针的大小和系统相关,32位机器为4字节,64位机器为8字节,指针的大小也要作为最大对齐数的考虑范围。

代码说明如下:

#includeusing namespace std;


class Base{
    
public:
    virtual void func() = 0;
     //纯虚函数,会生成虚函数表指针
public:
    char m_valChar;

}
    ;


class Son: public Base{

public:
    void func() {
}
    ;
    
public:
    int m_SonvalInt;

}
    ;


int main () {
    
   
    cout  "sizeof(Base) = "  sizeof(Base)  endl;
     cout  "sizeof(Son) = "  sizeof(Son)  endl;
     system("pause");
     return 0;
 }
     

代码运行结果为:

Base类的大小为8字节,是因为虚函数表指针占用了4字节,所以Base类的最大对齐数为4字节,虚函数表在构造函数的时候就会生成,所以,虚函数表指针肯定优先存储,

所以Base类大小的计算为:

sizeof(Base) = 4 + 1 + 3(浪费) = 8字节

则Son类的大小计算为:

sizeof(Son)= 4 + 1 + 3(浪费) + 4 = 12字节


以上就是关于“C++类的大小怎么算,方法是什么”的介绍了,感谢各位的阅读,希望文本对大家有所帮助。如果想要了解更多知识,欢迎关注网络,小编每天都会为大家更新不同的知识。

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!


若转载请注明出处: C++类的大小怎么算,方法是什么
本文地址: https://pptw.com/jishu/654794.html
go语言slice的用法是什么,slice使用要注意哪些 Golang协程泄露的问题怎样防范应对

游客 回复需填写必要信息