目录
0.前言
本来这个问题是很简单的,但是看了几个博客,嗯~,不能说别人写的不好。反正各有缺点。
这种情况,我更愿意自己动手。
先推荐一首歌《黑街》——陈雅雯。
首先声明一下,我是在64位下计算的哦。
1.空类
大小不是0。是1。首先要知道空类并不是正的空,肯定含有构造以及析构。至于为什么是1,C++标准的规定。一个独立的对象都必须具有非零大小。
class A{
};
2.普通类
2.1只含变量的类
类型如下
class B {
char ch;
int num;
double n;
};
大小是16,这个就和结构体的大小一样,字节对齐。
加上指针,大小变成24。也是一样,字节对齐。
class B {
double n;
int val;
char ch;
int *p;
};
2.2包含函数
2.2.1普通函数
如下。大小是24。因为类的大小只与它的数据成员有关,与普通成员函数、构造函数、析构函数无关。
class B {
double n;
int val;
char ch;
int *p;
int func(){};
};
那如果在函数里定义变量呢?
class B {
double n;
int val;
char ch;
int *p;
int func(){
int num;
};
};
一样的,只要是函数里,都无关。还是24。
2.2.2包含虚函数
看下面这个类的大小。
class B {
char ch;
int *p;
virtual int func1() {};
virtual void func2(){};
virtual int func3(){
int n=5;
};
};
大小是24。因为虚函数的形成是由一个指针指向虚函数表,所以是一个指针的大小,不论几个虚函数。
注意:有虚函数的,这个指向虚函数表的指针放在首位置。上面这些代码就相当于
class B {
int *p; //假设这是指向虚函数表的指针
char ch;
int *p;
};
2.3包含静态成员变量以及函数
2.3.1包含静态成员变量
如下,大小是16。因为静态数据成员保存在全局静态数据区,所以只是看前面三个,字节对齐16。
class B {
char ch;
int num;
int *p;
static int num2;
};
2.3.2包含静态函数
大小是24。静态,属于静态区。
class B {
char ch;
int num;
int *p;
static int num2;
static void func() {};
virtual void func2() {};
};
3.继承
3.1单一继承
class A{
char ch;
int num;
int *p;
};
class B:public A{
char cchh;
};
这样来看B的大小是多少呢?没错24。其实就等价C。
class C{
char ch;
int num;
int *p;
char cchh;
};
这个继承对上面的都成立,包括静态,虚函数,都是一样的。
注意,当基类是空类的时候,此时空类的大小是0。
class A{
};
class B:public A{
int a;
};
所以B的大小是4。
3.2多继承
看C的大小多少。
class A{
char ch;
int num;
int *p;
};
class B:public A{
char cchh;
static int *pp;
virtual void func() {};
};
class C:public B{
int arr[7];
};
我们先分析到B的大小。B的大小是32,很容易分析出来。然后C继承过来后首先包含32大小。然后是包含数组的大小。相当于7个int型。(注意,有虚函数,相当于在起始位置就是一个指针。)然后字节对齐,即是56。 这个C就相当于。
class C{
virtual void func() {}; //有虚函数 指针放在起始位置 8
char ch;
int num; // 8
int *p; // 8
char cchh; //8
static int *pp;
int arr[7]; //arr[0]与上面char cchh放一起
// arr[1]arr[2] 8 3,4--8 5,6--8
};
4.补充
也是刚遇到的,枚举类型的大小。
enum num{
one,
two,
three
};
问sizeof(num)是多大?
答案是4。
5.总结
道阻且长。
长风破浪会有时,直挂云帆济沧海。
同志们!