本期来了解一下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++基础知识点,感兴趣的小伙伴欢迎评论区留言、点赞、转发。