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

jasonM2008 2008-11-13 09:41:59

#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,函数难道不占用内存空间吗???至少应该放个函数指针在里面的吧??内存是怎样布局的,

静态成员应该是属于类的,怎么类的大小中没有包含静态成员的大小????
自己愚昧,很困惑,请高人指点!!!!!!!!
...全文
1306 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
riverking 2012-03-12
  • 打赏
  • 举报
回复
建议看看《深度探索C++对象模型》这本书,一切尽在里面
kin988g 2011-09-28
  • 打赏
  • 举报
回复
受教了....谢了
longqijun 2011-02-25
  • 打赏
  • 举报
回复
总算明白了一点,
felton321 2009-03-21
  • 打赏
  • 举报
回复
我也学到了知识!!
felton321 2009-03-21
  • 打赏
  • 举报
回复
erter
superdiablo 2008-11-15
  • 打赏
  • 举报
回复
函数代码是怎样找到的你要参考汇编教材。简单来说,在链接时已经把函数的具体地址写在了程序的二进制代码中。
Taker_z 2008-11-15
  • 打赏
  • 举报
回复
我也补充一些:
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。
额,不知道有没有说错。

jasonM2008 2008-11-15
  • 打赏
  • 举报
回复
谢谢各位的解释,不过期待更详细的关于函数的代码的地址是怎样找到的说明!!
superdiablo 2008-11-15
  • 打赏
  • 举报
回复
函数是不算到sizeof中的,因为函数是代码,被各个对象共用,跟数据处理方式不同。对象中不必有函数指针,因为对象没必要知道它的各个函数的地址(调用函数的是其他代码而不是该对象)。
静态成员并不属于某个对象,sizeof取的是对象大小。
ct_qy 2008-11-14
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 jasonM2008 的回复:]
传入指针只能所成员函数能访问到对象的数据成员,但是对象怎样来访问他的成员函数呢?????????
比如myObject.Fun();这样访问必须在对象的内存空间里面保存成员函数地址才行啊!!!!!!!!!!!
[/Quote]

成员函数地址是全局已知的,对象的内存空间里根本无须保存成员函数地址。
对成员函数(非虚函数)的调用在编译时就确定了。
像 myObject.Fun() 这样的调用会被编译成形如 _CObject_Fun( &myObject ) 的样子。
jasonM2008 2008-11-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 liyinlei 的回复:]
类的成员函数 实际上与 普通的全局函数一样。
只不过编译器在编译的时候,会在成员函数上加一个参数,传入这个对象的指针。
[/Quote]
加入这个参数的目的只是让成员函数能访问对象的数据成员啊!!!!!!!但是对象怎样来访问他的成员函数呢????????
比如,myObject.Fun();要这样访问的话,必须在对象的内存空间里面保存成员函数的地址才行啊????????
还是很糊涂!!!
jasonM2008 2008-11-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 liyinlei 的回复:]
类的成员函数 实际上与 普通的全局函数一样。
只不过编译器在编译的时候,会在成员函数上加一个参数,传入这个对象的指针。
[/Quote]
传入指针只能所成员函数能访问到对象的数据成员,但是对象怎样来访问他的成员函数呢?????????
比如myObject.Fun();这样访问必须在对象的内存空间里面保存成员函数地址才行啊!!!!!!!!!!!
shuyisheng 2008-11-14
  • 打赏
  • 举报
回复
编译肯定知道大小了,分配内存空间无关,知道大小了,以后实例化了才能知道要分配多大。
liyinlei 2008-11-14
  • 打赏
  • 举报
回复
类的成员函数 实际上与 普通的全局函数一样。
只不过编译器在编译的时候,会在成员函数上加一个参数,传入这个对象的指针。
jasonM2008 2008-11-14
  • 打赏
  • 举报
回复
[quote]类的普通成员、静态成员函数是不占类内存的[\quote]
如果不占用内存的话,也就是说函数的指针没有放在对象的内存空间里面,那对象怎样访问他自己的成员函数和静态成员呢???????
sys0005 2008-11-13
  • 打赏
  • 举报
回复
1)Sizeof(CObject)是在编译时就计算了的,一个类定义了,它所占的内存编译器就已经知道了,这时只是得到它占用的大小,并没有分配内存操作
2)类的普通成员、静态成员函数是不占类内存的,至于你说的函数指针在你的类中有虚函数的时候存在一个虚函数表指针,也就是说如果你的类里有虚函数则sizeof(CObject)的值会增加4个字节

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧