C++中类和结构体在内存中的存储问题

简单点,非静态成员变量占用空间,成员函数(无论是否是静态的)则不占用空间:

class  MyClass{

int a;  //占用4字节

float b; //占用4字节

static int c;//在全局数据区,所有对象共享,不计入各对象中

int fun1(); //不占用对象的空间

float fun2();//不占用对象的空间

static int fun3();//不占用对象的空间

};


MyClass类的实例中:

占用2*4=8个字节 (即a b这两个成员)




涉及虚函数表那些你在另外研究。


c++中struct和class在计算对象大小时你就不用区别了,计算方法一样。

C++中类和结构体在内存中的存储问题_第1张图片




就拿你的例子来说

一,
int a;      //类的成员变量,当类实例化后占用内存空间
float b;    //同上
static int c;    //处于静态数据内存区,程序运行后同一分配,与类的实例化与否无关

二,
函数的地址存在于代码区,不占用对象内存。
但是对于含有虚函数的类来说,实例化后的对象中必定会有一个指向虚函数表的指针,
占用一个指针的空间。

三,
MyClass *myClass;    //在栈上分配一个指针,但你不知道它指向哪里,因为没有给它赋值。
如果是
MyClass *myClass = new MyClass; 这样,在堆内存上创建了一个MyClass类型的对象,
完成了内存的分配,就可以通过这个指针访问int a,float b,以及fun1()之类的成员变量了。

四,
占用空间大小的话class和struct应该是相同的,不过这里有个字节对齐的概念
typedef struct
{
int a;
char b;
int c;
}MyStruct;
和
typedef struct
{
int a;
int c;
char b;
}MyStruct;
实例化后所占的内存空间是不一样的,有兴趣可以去了解一下。



注:

typedef struct
{
char b;
int a;
char c;
}MyStruct1;
和
typedef struct
{
int a;
char b;
char c;
}MyStruct2;

sizeof(MyStruct1) = 12  , sizeof(MyStruct2) = 8
32位系统一般是4字节对齐,不满4个字节会自动补足。

你可能感兴趣的:(C++学习)