首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

关于C++中类和对象内存分配有关问题!

2012-03-20 
关于C++中类和对象内存分配问题!!!!!!!!!C/C++ code#includeiostream.hclass CObject{public:static int

关于C++中类和对象内存分配问题!!!!!!!!!

C/C++ code
#include"iostream.h"class CObject{public:    static int a;    CObject();    ~CObject();    void Fun();private:    int m_count;    int m_index;};void CObject::Fun(){    cout<<"Fun\n"<<endl;}CObject::CObject(){    cout<<"Construct!\n";}CObject::~CObject(){    cout<<"Destruct!\n";}int CObject::a=1;void main(){    cout<<"Sizeof(CObject):"<<sizeof(CObject)<<endl;    //CObject::Fun();    cout<<"CObject::a="<<CObject::a<<endl;    CObject myObject;    cout<<"sizeof(myObject):"<<sizeof(myObject)<<endl;    cout<<"sizeof(int)"<<sizeof(int)<<endl;}

这是我的一段测试代码,
运行结果是:
Sizeof(CObject):8
CObject::a=1
Construct!
sizeof(myObject):8
sizeof(int)4
Destruct!

我有疑问如下:
C++中,应该是对象才会被分配内存空间吧??为什么CObject内存大小是8,刚好和两个成员变量的大小之和一致!!!!难道还没实例化的时候,类就已经有了内存空间了??????

当对象生成了之后,算出的内存大小怎么还是8,函数难道不占用内存空间吗???至少应该放个函数指针在里面的吧??内存是怎样布局的,

静态成员应该是属于类的,怎么类的大小中没有包含静态成员的大小????
自己愚昧,很困惑,请高人指点!!!!!!!!


[解决办法]
1)Sizeof(CObject)是在编译时就计算了的,一个类定义了,它所占的内存编译器就已经知道了,这时只是得到它占用的大小,并没有分配内存操作
2)类的普通成员、静态成员函数是不占类内存的,至于你说的函数指针在你的类中有虚函数的时候存在一个虚函数表指针,也就是说如果你的类里有虚函数则sizeof(CObject)的值会增加4个字节
[解决办法]
类的成员函数 实际上与 普通的全局函数一样。
只不过编译器在编译的时候,会在成员函数上加一个参数,传入这个对象的指针。
[解决办法]
编译肯定知道大小了,分配内存空间无关,知道大小了,以后实例化了才能知道要分配多大。
[解决办法]
探讨
传入指针只能所成员函数能访问到对象的数据成员,但是对象怎样来访问他的成员函数呢?????????
比如myObject.Fun();这样访问必须在对象的内存空间里面保存成员函数地址才行啊!!!!!!!!!!!

[解决办法]
函数是不算到sizeof中的,因为函数是代码,被各个对象共用,跟数据处理方式不同。对象中不必有函数指针,因为对象没必要知道它的各个函数的地址(调用函数的是其他代码而不是该对象)。
静态成员并不属于某个对象,sizeof取的是对象大小。
[解决办法]
我也补充一些:
class CObject
{
public:
static int a;
CObject();
~CObject();
void Fun();

private:
double m_count; //这里改成了double
int m_index;
};
这个类用sizeof()测出来的大小是 2*sizeof(double)=16

class CObject
{
public:
static int a;
CObject();
~CObject();
void Fun();

private:
char m_count; //这里改成了char
int m_index;
};
大小是2*sizeof(int)=8

class CObject
{
public:
static int a;
CObject();
~CObject();
void Fun();

private:
double m_count; //这里改成了double
int m_index;
char c;
};
sizeof(char)+sizeof(int)<sizeof(double) 所以大小是2*sizeof(double)

空类大小是1。
额,不知道有没有说错。


[解决办法]
函数代码是怎样找到的你要参考汇编教材。简单来说,在链接时已经把函数的具体地址写在了程序的二进制代码中。

热点排行