sizeof(类)的问题——高手请进!!

BORLANDSUN 2011-05-29 01:55:43
今天翻开书看了会sizeof,遇到个问题,希望能有所指点。代码如下:
class TCar
{
public:
TCar(void)
{
Wheels = 0;
}
int Wheels;
};

int main()
{
TCar aCar;
int size = sizeof(aCar);

return 0;
}

这段代码中size的值为4,难到构造函数不需要占用内存空间吗?
...全文
158 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
giant1st 2011-05-29
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 dizuo 的回复:]

成员函数单独存储,一个类只有一份。
[/Quote]

Nod!

关于虚函数,是因为它要维护一张表,通过指针来实现,所以会占用一个指针的大小。。。

你的标题需要改一下,sizeof(对象),TCar是类。 aCar是对象。。。
abcdef0966 2011-05-29
  • 打赏
  • 举报
回复
7/8楼说得才靠谱吧。楼主声明个虚函数试试?
LZS535261548 2011-05-29
  • 打赏
  • 举报
回复
你自己设计的类的大小根据其中的变量确定
crjwlaq 2011-05-29
  • 打赏
  • 举报
回复
对象大小只计算成员变量的
doubleH 2011-05-29
  • 打赏
  • 举报
回复
补充一下,不是每个虚函数都要占用四个字节,其实是只要有虚函数,虚函数总共占用4个字节。类所占用的字节是相关占用字节(比如虚函数,变量等)之和。
doubleH 2011-05-29
  • 打赏
  • 举报
回复
1、如果有虚函数,虚函数占用4个字节
2、如果是非虚成员函数,不占用字节
3、变量占用实际要占用的字节,如char占用一个字节,int占用4个字节,double占用8个字节,long也占用4个字节
4、如果类什么都没有,或者只有非虚成员函数,那么类占用一个字节,这是为了区分它是一个类而分配的一个字节的内存。
lz的类包含一个非虚构造函数和一个int型变量,所以只占int的4个字节
ryfdizuo 2011-05-29
  • 打赏
  • 举报
回复
成员函数单独存储,一个类只有一份。
vcf_reader 2011-05-29
  • 打赏
  • 举报
回复
成员函数都不占对象的空间
qingkongxiaoyang 2011-05-29
  • 打赏
  • 举报
回复
32位机器VC编译器下。
如果没有虚的构构函数,没有成员变量 。
对象会占一个字节。即
class CTest
{
CTest();
~CTest();
}
CTest t;
sizeof(t) =1
具体的可以参考下文章,http://blog.csdn.net/qingkongxiaoyang/archive/2011/05/17/6427275.aspx
希望对你有帮助。
MewX 2011-05-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 pengzhixi 的回复:]

是的。所有的成员函数都不占对象的空间
[/Quote]

构造函数一般是用于赋值的,它的功能不占用额外的空间。
kakane 2011-05-29
  • 打赏
  • 举报
回复
只返回成员变量的大小
A28496647 2011-05-29
  • 打赏
  • 举报
回复
如果把int, char,等比作实体的话,类,函数算是一个比较虚的东西,我不知如何给你描述。
giant1st 2011-05-29
  • 打赏
  • 举报
回复
分享一个更绝的例子:

#include<iostream.h>
class a {};
class b{};
class c:public a{
virtual void fun()=0;
};
class d:public b,public c{};
int main(){
cout<<"sizeof(a)"<<sizeof(a)<<endl;
cout<<"sizeof(b)"<<sizeof(b)<<endl;
cout<<"sizeof(c)"<<sizeof(c)<<endl;
cout<<"sizeof(d)"<<sizeof(d)<<endl;
return 0;
}

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/lenic/archive/2009/05/18/4199114.aspx

程序执行的输出结果为:

sizeof(a) =1

sizeof(b)=1

sizeof(c)=4

sizeof(d)=8

为什么会出现这种结果呢?初学者肯定会很烦恼是吗?类a,b明明是空类,它的大小应该为为0,为什么 编译器输出的结果为1呢?这就是我们刚才所说的实例化的原因(空类同样可以被实例化),每个实例在内存中都有一个独一无二的地址,为了达到这个目的,编译器往往会给一个空类隐含的加一个字节,这样空类在实例化后在内存得到了独一无二的地址.所以a,b的大小为1.

而类c是由类a派生而来,它里面有一个纯虚函数,由于有虚函数的原因,有一个指向虚函数的指针(vptr),在32位的系统分配给指针的大小为4个字节,所以最后得到c类的大小为4.

类d的大小更让初学者疑惑吧,类d是由类b,c派生迩来的,它的大小应该为二者之和5,为什么却是8  呢?这是因为为了提高实例在内存中的存取效率.类的大小往往被调整到系统的整数倍.并采取就近的法则,里哪个最近的倍数,就是该类的大小,所以类d的大小为8个字节.

当然在不同的编译器上得到的结果可能不同,但是这个实验告诉我们初学者,不管类是否为空类,均可被实例化(空类也可被实例化),每个被实例都有一个独一无二的地址.

我所用的编译器为vc++ 6.0
pengzhixi 2011-05-29
  • 打赏
  • 举报
回复
是的。所有的成员函数都不占对象的空间

64,648

社区成员

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

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