
C++中的成员变量和成员函数在内存中是怎么存储的?与结构体中变量和函数的存储相同吗?
定义了一个类MyClass,类中有成员变量inta;floatb;staticintc;还有成员函数:intfun1()floatfun2()staticintfun3(...
定义了一个类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时,交换顺序,会有影响吗? 展开
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时,交换顺序,会有影响吗? 展开
2个回答
展开全部
就拿你的例子来说
一,
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;
实例化后所占的内存空间是不一样的,有兴趣可以去了解一下。
一,
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个字节会自动补足。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询