C++中的成员变量和成员函数在内存中是怎么存储的?与结构体中变量和函数的存储相同吗?

定义了一个类MyClass,类中有成员变量
int a;
float b;
static int c;
还有成员函数:
int fun1()
float fun2()
static int fun3()
……
我想知道这些普通的成员函数、变量,还有静态成员函数、变量,他们在内存中是怎么存储的~~
如果我定义该类的指针, MyClass *myClass;

那么myClass指向 的是什么???

另外,如果我定义一个结构体
typedef struct
{
int a;
float b;
int fun1();
}MyStruct;
那么, MyStruct myStruct;又是怎么存储的?定义a,b时,交换顺序,会有影响吗?

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

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在计算对象大小时你就不用区别了,计算方法一样。

温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2018-03-29
就拿你的例子来说

一,
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;
实例化后所占的内存空间是不一样的,有兴趣可以去了解一下。追问

为什么以上的结果都是12呢,为什么不是9,

不是说结构体结果不一样吗,为什么都相同?

追答

例子举得不恰当,应该这样子

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个字节会自动补足。

本回答被提问者采纳
相似回答