从零开始学C++11新标准知识(内含大厂面试题100道)第五期

本期来了解一下C++中类的大小相关问题

类的大小是如何计算的呢?

我们说的类的大小是指,类的实例化对象的大小,当使用sizeof对类名进行操作时,其返回值是该类数据类型的对象的大小。

计算原则:遵循结构体的对齐原则

与普通成员变量有关,与成员函数和静态成员无关。即普通成员函数,静态成员函数,静态数据成员、静态常量数据成员均对类的大小没有影响,因为静态的数据成员被类的对象所共享,并不属于哪个具体的函数。

虚函数对类的大小有影响,因为虚函数表指针带来的影响。

虚继承对类的大小也有影响,因为虚基表指针带来的影响。

空类的大小是一个特殊情况,空类的大小为1,当用new来创建一个空类的对象时,为了保证不同对象的地址不同,空类也占用存储空间。

/*基于64位编译器测试代码*/
#include <iostream>

using namespace std;

Class Test1{
private:
     static int str_var;//不影响类的大小
     const  int ctr_var;//4字节
     int var;           //8字节  4+4(int)= 8
     char var1;         //12字节 8+1(char)+3(填充字节)=12
public:
     A(int temp):ctr_var(temp){}  // 不影响类的大小
     ~A(){}                       // 不影响类的大小
};

Class Test2{
};
int main(){
     A ex1(4);
     B ex2;
     cout<<sizeof(ex1)<<endl; // 12字节
     cout<<sizeof(ex2)<<endl; // 1字节
     return 0;
}

下面是带有虚函数的情况:

/*基于64位编译器测试代码*/
#include <iostream>

using namespace std;

Class Test1{
private:
     static int str_var;//不影响类的大小
     const  int ctr_var;//4字节
     int var;           //8字节  4+4(int)= 8
     char var1;         //12字节 8+1(char)+3(填充字节)=12
public:
     A(int temp):ctr_var(temp){}  // 不影响类的大小
     ~A(){}                       // 不影响类的大小
     virtual void f(){cout<<"A::f"<<endl;}
     virtual void g(){cout<<"A::g"<<endl;}
     virtual void h(){cout<<"A::h"<<endl;}//24字节 是12+4个填充字节+8位指向虚函数的指针=24
};


int main(){
     A ex1(4);
     A *P;
     cout<<sizeof(P)<<endl; // 8字节 指针所占空间与指针指向的数据类型无关

     cout<<sizeof(ex1)<<endl; // 24字节
     return 0;
}

特别注意点:虚函数的个数并不影响所占内存的大小,因为类对象的内存中只保存了指向虚函数表的指针。

好啦,以上就是今天所学到的一个重要的C/C++基础知识点,感兴趣的小伙伴欢迎评论区留言、点赞、转发。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序小白Erike.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值