关于sizeof(类)的大小
无意中看到篇关于c++中计算sizeof(类)大小的文章,结果在尝试做里面的相关题目时错了好多,好吧这是基础不扎实的结果,有必要再恶补一次。
1. 先看这么一个问题:
class A
{
};
sizeof(A)会是多长呢,答案: sizeof(A) = 1(如果这个真不知道,估计c++白学了);关键是为什么呢,为什么空的什么都没有却是1呢,原来类是需要实例化的,所谓类的实例化,就是在内存中为其分配一块地址(这块地址是独一无二的),同样空的类也会被分配地址,而编译器会给空类隐式添加一个字节。这样空类实例化后就有一个独一无二的地址了。
2.第一个问题解决了,那么如果加上构造函数和析构函数呢,看下面这个
class B
{
B();
~B();
};
sizeof(B)=多少呢,答案还是1,为什么呢,原来构造函数和析构函数是不会计算到类的大小里面去的,怎么不信?你可以试试,你可以试图改变类的构造函数,随便你怎没改。
3.如果类中有虚函数呢,看下面这个
Class C
{
virtual void fun();
};
sizeof(C)又是多少呢? 首先要注意一点,类中有虚函数,说明存在了一个指针指向次函数,在32位系统中指针大小为4个字节。所以嘛sizeof(C) = 4;哈哈你是否被绕进去了,没错这是对的。
4.关于类中有不同变量
Class D
{
int x;
double y;
char c;
};
sizeof(D) 是多少呢,结果为24,这里要考虑内存对齐问题,只要记住类中的变量都是以占有最大字节的那个变量对其的就可以了,这里double占8个字节。
5 如果是这样呢
Class A
{
int x;
};
Class B : public A
{
char m;
};
sizeof(B)是多少? sizeof(B) = 8;可见子类的sizeof大小为父类和子类的和。
6。虚拟继承
class A
{
int x;
};
class B : virtual public A
{
int y;
};
sizeof(B) = 12;为什么呢,这里可以理解为类B多了一个指向类A的指针。
7.static成员
class A
{
static int a;
static void fun();
};
sizeof(A) = 1;可见静态成员并不占用类的大小。为什么呢,这是因为静态成员有专门的存储区域,虽然继承类不能访问它们。
8.如果子类和基类都有虚函数呢
class A
{
virtual void funA();
};
class B
{
virtual void funB();
};
sizeof(B) = 4;这是为什么呢,虚函数表还是只有一张,不会因为多了一个虚函数就增加一个虚函数表来,新的虚函数的指针是复制到了该张表中。