类所占内存大小,这里做一下实验:
1.只有成员函数
class A
{
A()
{
;
}
~A()
{
;
}
void atest()
{
;
}
};
printf("%d\n",sizeof(A));值为1,
当类中没有定义数据成员时,也就是没有占据存储空间,但是由于当创建一个对象时,要标识一个对象,必须通过给它分配存储空间来引用对象,所以系统会给它分配一个字节。里面的成员函数的增减并不会影响分配内存的大小。
2.有虚函数的情况
class A
{
A()
{
;
}
~A()
{
;
}
virtual void atest()
{
;
}
};
printf("%d\n",sizeof(A));输出的值为4
由于有一个虚函数,此时需要引入了一个隐含的虚表指针成员,所以为4。
3.有成员变量的情况
class A
{
A()
{
;
}
~A()
{
;
}
int a;
double b;
};
printf("%d\n",sizeof(A)); //输出为16
此时的成员变量需要占内存空间,考虑到字节对齐的情况,所以输出的结果为16
4.静态成员变量的影响
class A
{
public:
A()
{
;
}
~A()
{
;
}
double a;
static int b;
};
int A::b=5;
printf("%d\n",sizeof(A));///输出的值为8
因为变量b为静态成员变量,编译时放在了全局的编译区,它是类的一个数据成员.但是它不影响类的大小,不管这个类实际产生了多少实例,还是派生了多少新的类,静态成员数据在类中永远只有一个实体存在,而类的非静态数据成员只有被实例化的时候,他们才存在.但是类的静态数据成员一旦被声明,无论类是否被实例化,它都已存在。
类的静态数据成员必须在类外初始化。只有静态常量才能在类中初始化
所以在计算类的大小时(sizeof计算时)静态成员变量的内存大小没有包括在内。
综上所述,在计算类所占的内存空间时,主要包括一下几部分内容:
非静态数据成员的大小
隐含的虚表指针成员
性能优化采用的地址对齐
类继承时,和成员函数所占内存空间方法一样。相加,但要考虑地址对齐。