c++ 类的大小
#### C++ 类的大小解析
面试中常被问到,一个类所占的空间大小,并在拥有不同成员时的情况
1. 空类
class Empty{
};
Empty p;
cout<<sizeof(p) //输出 1
由此可以看到,一个空类的大小为1
2.带成员函数的空类
class Empty{
public:
Empty(){ cout<<"Construct function"<<endl;}
~Empty(){ cout<<"Destruct function"<<endl;}
void print(){ cout<<"Print function"<<endl;}
};
Empty p;
cout<<sizeof(p); //输出1
根据实验,普通的成员函数并不会增加类的大小,此时类的大小还是为1
3.带成员变量的类
class Empty{
public:
Empty(){ cout<<"Construct function"<<endl;}
~Empty(){ cout<<"Destruct function"<<endl;}
void print(){ cout<<"Print function"<<endl;}
private:
int data;
};
Empty p;
cout<<sizeof(p); //输出4
//此时类的大小与成员变量的大小相同
//当我们把成员变量进行修改
private:
double data;
int n;
char c; //此时的类大小变成了24, 而正常来说double占8位,int 4 位 char 1位,共13位
这里存在一个内存对齐的问题
在C++类中,不同的同样的成员变量在不同的声明顺序下会产生不同的内存构造模型
对于 char a, int n, double data,其内存模型为
而 char a, double data, int n, 内存模型为
4.无虚函数的继承
class Base{
public:
long long p;
};
class Empty: public Base{
public:
Empty(){ cout<<"Construct function"<<endl;}
~Empty(){ cout<<"Destruct function"<<endl;}
void print(){ cout<<"Print function"<<endl;}
private:
int c;
};
此时的 大小为 8+4=16 为父类成员变量与子类成员变量的和,这里也需要注意内存对齐问题
5.含虚函数的继承
class Base{
public:
//char b;
virtual void vprint(){
cout<<"virtual function\n";
}
};
class Empty: public Base{
public:
Empty(){ cout<<"Construct function"<<endl;}
~Empty(){ cout<<"Destruct function"<<endl;}
void print(){ cout<<"Print function"<<endl;}
void vprint(){
cout<<"empty\n";
}
private:
//int c;
//char a;
};
此时多了父类的一个虚表指针,其大小为4
若子类也含有虚函数,类的大小还需加上虚表指针的大小( 不同平台下表现不同,gcc下会共用基类虚表指针
总结:
与类的大小有关的因素:
普通成员变量,虚函数,继承
与类大小无关的因素:
静态成员变量,静态成员函数,普通成员函数