C++语言内存四区的概念:栈区,堆区,全局区,代码区。
定义一个空类。
Void myClass
{
Private:
Protected:
Public:
};
Void main()
{
Printf(“%d”,sizeof(myClass ));
}
发现一个空类占用一个字节,这一个字节叫作"占位符",那1个字节是用来占一个空间,获取这个地址的,地址才是唯一标识符。
定义两个类A1,A2,分别求A1和A2占多少个字节。
class C1
{
public:
int i;
int j;
int k;
protected:
private:
};
class C2
{
public:
int i;
int j;
int k;
static int m;
public:
int getK() const { return k; }
void setK(int val) { k = val; }
protected:
private:
};
void main()
{
printf("c1:%d \n", sizeof(C1));
printf("c2:%d \n", sizeof(C2));
}
结果发现C1和C2同样都是12个字节。
解释原因:
1)C++类对象中的成员变量和成员函数是分开存储的
成员变量:
普通成员变量:存储于对象中,与struct变量有相同的内存布局和字节对齐方式
静态成员变量:存储于全局数据区中,静态成员不可在类体内进行赋值,也不能在类的构造函数中初始化该成员,因为它是被所有该类的对象所共享的。它在对象中不占用存储空间,你在一个对象里给它赋值,其他对象里的该成员也会发生变化。为了避免混乱,所以不可在类体内进行赋值。
静态成员可以被初始化,但只能在类体外进行初始化。
成员函数:存储于代码区中。
因此C1和C2计算的内存空间都是普通成员变量所占用的空间(堆区),但是并不代表C1就和C2完全一样,他们本质不一样。