本文主要讲解在C++中建立一个新类会占用的字节数,这是面试中经常会被问的一道题。
1.建立一个空类,里面什么都没有,没有成员函数,也没有成员变量;
#include <iostream>
using namespace std;
class Person{
};
int main(){
cout<<sizeof(Person)<<endl;
return 0;
}
返回的结果是:
所以说,建立一个空的类,占用一个字节数。因为C++要求每个实例在内存中都要有独一无二的地址。
2.类中有成员变量(非静态),没有静态成员变量和成员函数
#include <iostream>
using namespace std;
class Person{
private:
int weight;
int height;
};
int main(){
cout<<sizeof(Person)<<endl;
return 0;
}
结果是:
这很容易解释,因为int型占用4个字节,两个int就占用8个字节。那空类的那1个字节去哪里了? 那个字节是隐藏的,当有成员变量或虚函数占用空间时,它就消失了。
3.类中含有静态成员变量
#include <iostream>
using namespace std;
class Person{
private:
static int weight;
int height;
};
int main(){
cout<<sizeof(Person)<<endl;
return 0;
}
结果:
哦,原来静态的成员变量不占用字节数。为什么会不占用字节数呢?因为静态成员变量不在类的内部空间,而在类的外部静态区,所以计算类的大小时,是不包含静态变量的大小的。
4.类中只有普通成员函数
#include <iostream>
using namespace std;
class Person{
public:
void eat();
};
int main(){
cout<<sizeof(Person)<<endl;
return 0;
}
结果:
可以看出,普通函数是不占用类的内存空间的。因为我们访问类的成员函数,是通过eat(Person.this)来调用的,也就是说,通过这个this指针指向一个table,这个table保存的是各个成员函数的地址。
5.类中存在虚函数
#include <iostream>
using namespace std;
class Person{
public:
void eat();
virtual void run();
};
int main(){
cout<<sizeof(Person)<<endl;
return 0;
}
在32位系统中,结果是4; 在64位系统下是8。 这个大小也就是虚函数表指针的大小。无论有多少个虚函数,无论衍生出多少个子类,都只存在一个虚函数表的指针。这个指针存放的是虚函数表在内存中的地址。
6.类中数据对齐处理
#include <iostream>
using namespace std;
class Person{
public:
void eat();
private:
char sex;
int height;
int weight;
};
int main(){
cout<<sizeof(Person)<<endl;
return 0;
}
结果是:
虽然有一个char类型,本身只占一个字节,但是为了和int对齐,自动变为和int 相同的大小,所以占用的字节数为12