关于对象的存储空间的问题

hshhgh 2004-10-14 09:19:53
#include <iostream.h>
#include "stdafx.h"

class fu
{
public:
fu(){cout<<"fu\n";};
virtual ~fu(){cout<<"xigoufu\n";};

int a;
char b;
};

main(int argc, char* argv[])
{
fu obj;
cout <<"sizeof(obj.a):["<<sizeof(obj.a)<<"]"<<endl;
cout <<"sizeof(obj.b):["<<sizeof(obj.b)<<"]"<<endl;

cout <<"sizeof(fu): ["<<sizeof(fu) <<"]"<<endl;
cout <<"sizeof(obj):["<<sizeof(obj)<<"]"<<endl;
}

为什么我的输出:sizeof(obj.a):4
sizeof(obj.b):1
sizeof(fu) :12
sizeof(obj) :12
而我用quick watch看了一下,sizeof(obj.fu()) :0
sizeof(obj.~fu()) :0
sizeof(fu.fu()) :4
sizeof(fu.~fu()) :4

想知道:sizeof(obj) 为什么不等于sizeof(obj.a)+sizeof(obj.b)
sizeof(fu) 为什么不等于sizeof(fu.fu())+sizeof(fu.~fu())+sizeof(fu.a)+sizeof(fu.b)
...全文
176 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
nwpulipeng 2004-10-15
  • 打赏
  • 举报
回复
说的不错,就是这样
我混分吧
lamputa_lito 2004-10-15
  • 打赏
  • 举报
回复
这个问题在c++对象模型里有完整的解答。
sizeof(obj.a):4 //这个就不用说了,int类型,4字节
sizeof(obj.b):1 //这个与上面的一样,char类型,1字节
sizeof(fu) :12 //size of fu与下面是一样的
sizeof(obj) :12 //对象里有一个 int --4字节 一个char ---1字节 编译器会在带有虚函数的对象里安插一个虚函数表指针 --4字节 ,总共加起来是9字节,但是编译器会把对象的大小填充到12字节(以满足数据bus达到最大传输量,这样看来你用的编译器是以4字节为单位的(有的编译器以8字节为单位))

sizeof(obj.fu()) //这是一个对象函数,对象函数的代码是放在代码区的,而不会放在每个对象身上,而obj是一个对象,所以其值为0,同样的道理,sizeof(obj.~fu())为0
sizeof(fu.fu()) //应该是fu::fu()把,没有fu.fu()这种引用方法的。这是通过类来引用一个函数,编译器其实会把它转换为一个函数指针(其实编译器会把fu::fu()转化为一般的函数来对待的,而不会是我们概念中的成员函数,也就是说,成员函数会被编译器转换为普通函数。所以它是一个函数指针,自然是4个字节。同理,下面的也是一样的。

请问有哪位也在研究c++的实现问题呢,或者在看c++对象模型一书,我遇到很多问题,希望能跟大家一起讨论学习,有兴趣的可以加我QQ:25502497
sizeof(fu.~fu()) :4
xiuluo2305 2004-10-15
  • 打赏
  • 举报
回复
看不懂
dafan 2004-10-15
  • 打赏
  • 举报
回复
Huh,我大概了解了一些:在这里,变量的存储空间向大的靠齐,姑且规定为一个存储单位(aa)。如char (1)是向int(4)靠近,变成4,这时的存储单位aa=4,虚函数表要占用一个存储单位。具体请看:
(注:obj是fu的一个对象)

【step 1】
fu(){ cout << "gou zao" << endl; }
~fu() { cout << "xi gou" << endl; }
char a;
char b;

the size of a: 1
the size of a: 1
the size of fu: 2
the size of obj: 2

【step 2】
fu(){ cout << "gou zao" << endl; }
virtual ~fu() { cout << "xi gou" << endl; }
char a;
char b;

the size of a: 1
the size of a: 1
the size of fu: 8
the size of obj: 8

【step 3】
fu(){ cout << "gou zao" << endl; }
virtual ~fu() { cout << "xi gou" << endl; }
char a;
int b;

the size of a: 1
the size of a: 4
the size of fu: 12
the size of obj: 12

【step 4】
fu(){ cout << "gou zao" << endl; }
~fu() { cout << "xi gou" << endl; }
char a;
int b;

the size of a: 1
the size of a: 4
the size of fu: 8
the size of obj: 8

【step 5】
fu(){ cout << "gou zao" << endl; }
~fu() { cout << "xi gou" << endl; }
int a;
int b;

the size of a: 4
the size of a: 4
the size of fu: 8
the size of obj: 8

【step 6】
fu(){ cout << "gou zao" << endl; }
virtual ~fu() { cout << "xi gou" << endl; }
int a;
int b;

the size of a: 4
the size of a: 4
the size of fu: 12
the size of obj: 12

【step 7】
fu(){ cout << "gou zao" << endl; }
virtual ~fu() { cout << "xi gou" << endl; }
int a;
char b;

the size of a: 4
the size of a: 1
the size of fu: 12
the size of obj: 12

【step 8】
fu(){ cout << "gou zao" << endl; }
~fu() { cout << "xi gou" << endl; }
int a;
char b;

the size of a: 4
the size of a: 1
the size of fu: 8
the size of obj: 8
hshhgh 2004-10-15
  • 打赏
  • 举报
回复
而且sizeof(fu)也不等于
sizeof(fu::fu()) :0
sizeof(fu::~fu()) :0
sizeof(fu::a) :出错
sizeof(fu::b) :出错
四项之和呀?
hshhgh 2004-10-15
  • 打赏
  • 举报
回复
我跟踪了一下:
sizeof(fu::fu()) :0
sizeof(fu::~fu()) :0
sizeof(fu::a) :出错
sizeof(fu::b) :出错
不像 lamputa_lito(lamputa) 说的,为什么?



insulator 2004-10-14
  • 打赏
  • 举报
回复
我试了一下,即使把析构函数的virtual去掉,结果与以前没有任何差别呀?
===>
我试了一下怎么有差别啊
sizeof(obj.a):4
sizeof(obj.b):1
sizeof(fu) :8
sizeof(obj) :8

虚表指针要占4个字节,一共4+4+1,但有的编译器要补上3位,有的就不要了
所以

sizeof(obj.a):4
sizeof(obj.b):1
sizeof(fu) :12
sizeof(obj) :12

hjf1223 2004-10-14
  • 打赏
  • 举报
回复
UP一下,也想知道啊
xuzheng318 2004-10-14
  • 打赏
  • 举报
回复
this 指针,(隐含指针)
hshhgh 2004-10-14
  • 打赏
  • 举报
回复
请问 谁有 深度探索c++对象模型 的e书?
sharkhuang 2004-10-14
  • 打赏
  • 举报
回复
深度探索c++对象模 里面对此有深入讲解
hshhgh 2004-10-14
  • 打赏
  • 举报
回复
我试了一下,即使把析构函数的virtual去掉,结果与以前没有任何差别呀?
hshhgh 2004-10-14
  • 打赏
  • 举报
回复
按照各位的观点,那么sizeof(obj) 应该大于sizeof(obj.a)+sizeof(obj.b)
sizeof(fu) 应该大于sizeof(fu.fu())+sizeof(fu.~fu())+sizeof
但实际跟踪查看的情况并非如此呀?
快乐鹦鹉 2004-10-14
  • 打赏
  • 举报
回复
因为你的类里面有个虚函数。因此类里面有个隐藏的虚指针对象在里面。
江南编程浪子 2004-10-14
  • 打赏
  • 举报
回复
Vc 内存分配了int a 4个字节后char 会分配4个字节
然后Virtual 函数表分配4个字节,一共12个字节

和分开来看当然不一样的!

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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