类占用多少空间

fyl19870803 2010-06-09 08:25:36
一个类中的函数占用多少空间,我是这样算的:
(1)为了作区分,类必须要有储存空间,所以对于空类会分配1字节空间。
(2)一般函数是直接调用其入口地址,相当于只声明,所以不占用任何空间。
(3)虚函数不占对象的空间!但是指向虚函数表vTable的指针占4个字节的空间,不论你类里有多少个虚函数,你的对象大小只增加4个字节。
上面计算方法应该是没问题的,可是下面这个结果怎么解释呢?
根据类里面的字节对齐原则,我写了如下程序:
class X{
public:
X();
virtual void myVirtualFunc();
};

int main()
{
printf("%d\n",sizeof(X));
return 0;
}
运行结果为4。
可是他应该是1(类空间)+4(虚函数表指针)=5,字节对齐,结果应该是8的呀,这怎么解释?如果把虚函数myVirtualFunc去掉的话结果是1,难道如果加上了虚函数,类原来的1字节的空间就可以不要了?

...全文
281 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
yunyun1886358 2010-06-10
  • 打赏
  • 举报
回复
学习了。应该是类X并不是空类,它有虚表么,所以编译器就不额外分配一个字节了,所以size是4
softman11 2010-06-10
  • 打赏
  • 举报
回复
[Quote=引用楼主 fyl19870803 的回复:]
一个类中的函数占用多少空间,我是这样算的:
(1)为了作区分,类必须要有储存空间,所以对于空类会分配1字节空间。
(2)一般函数是直接调用其入口地址,相当于只声明,所以不占用任何空间。
(3)虚函数不占对象的空间!但是指向虚函数表vTable的指针占4个字节的空间,不论你类里有多少个虚函数,你的对象大小只增加4个字节。
上面计算方法应该是没问题的,可是下面这个结果怎么解释呢?
根据类……
[/Quote]

对的,你的想法是正确的。
有了内容,就不需要一个字节了。
因为一个字节并不代表任何实质内容,只是为了占位而已。表示一种存在。
ailyanlu 2010-06-10
  • 打赏
  • 举报
回复
有虚函数指针就不用那一个字节来占位了。。。
wzywsk 2010-06-10
  • 打赏
  • 举报
回复
恩~~没必要深究
qvbnlaw 2010-06-09
  • 打赏
  • 举报
回复
嗨!!这个估计需要看实际情况吧!!!
baihacker 2010-06-09
  • 打赏
  • 举报
回复
类本身在运行时占的空间是未知的,楼主是想问定义一个对象的时候占用空间的情况吧?
jvs 2010-06-09
  • 打赏
  • 举报
回复
X有虚函数,所以X不是空类,有了vptr那么就可以区分不同的对象在内存中的地址了
beyondzoro 2010-06-09
  • 打赏
  • 举报
回复
X有虚函数,不是一个空类
E等于MC平方 2010-06-09
  • 打赏
  • 举报
回复
对于一个类到底点多少空间, 记住LZ说得那三点就可了!
E等于MC平方 2010-06-09
  • 打赏
  • 举报
回复
这个问题真没有必要深久, 意义不大!
fyl19870803 2010-06-09
  • 打赏
  • 举报
回复
恩,现在终于懂了,谢谢3楼,4楼,5楼的大牛们了!~~
kkbel 2010-06-09
  • 打赏
  • 举报
回复
同意楼上的,飘过
qisinile 2010-06-09
  • 打赏
  • 举报
回复
新手,不是特别理解,前来学习
liutengfeigo 2010-06-09
  • 打赏
  • 举报
回复

不要深究。。。~
冻结 2010-06-09
  • 打赏
  • 举报
回复
对空类,编译器一般会给他加一个char。
是“一般”。好让它有个地址。
当然你的虚表指针的地址,就可以当成类对象的地址了。
一个char就没意义了。
当然还是那个字,“一般”。

看写编译器人的心情了。
其实这个问题,没必要深究。
mstlq 2010-06-09
  • 打赏
  • 举报
回复
X不是空类,说完……
pengzhixi 2010-06-09
  • 打赏
  • 举报
回复
是的,有了vptr那么就可以区分不同的对象在内存中的地址了。
fyl19870803 2010-06-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 lthyxy 的回复:]

不敢深究这问题。。。。~
[/Quote]
我们要有一种深入的精神嘛,遇到问题就把它给弄懂,这样才能学到更多的东西!呵呵
liutengfeigo 2010-06-09
  • 打赏
  • 举报
回复
不敢深究这问题。。。。~

70,023

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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