免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4435 | 回复: 11
打印 上一主题 下一主题

[C++] sizeof(对象)的两个疑问,求答案 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-02-01 17:13 |只看该作者 |倒序浏览
10可用积分
(1)用gcc编译出来的空对象大小是1个字节,这1个字节的占位符号有什么实际的意义吗? 我上网搜了一下,似乎其他的编译器有的生成的控对象有4个字节的,不一定都相同。这个1字节浪费了?
(2) 一个具有虚函数表的对象,为什么无论有多少个虚函数,size都是只增加了4?

===================================
下面这样一小段代码
#include <cstdlib>
#include <cstdio>
using namespace std;
class c1{
public:
    c1(){}
    ~c1(){}
};
struct c2{
};
class B{
      int x;
      virtual void f(){} ----->如果B类没有g函数和h函数,B的大小是8,有了g和h,B的大小还是8!!!!!!!!!!!!!!!!!!
      virtual void g(){}
      virtual void h(){}
};
int main(int argc, char *argv[])
{
    c1 j;
    printf("sizeof j=%d\n",sizeof(j));
    c2 k;
    printf("sizeof k=%d\n",sizeof(k));
    printf("sizeof B=%d\n",sizeof(B));
    B b1;
    printf("sizeof b1=%d\n",sizeof(b1));
}
输出是
ctor
sizeof j=1
sizeof k=1
sizeof B=8
sizeof b1=8
Press any key to continue . . .

10分求上面两个问题的答案! 谢谢!

[ 本帖最后由 jeanlove 于 2009-2-1 17:17 编辑 ]

最佳答案

查看完整内容

虚表会增大。。。可是虚表的地址长度不会变啊

论坛徽章:
0
2 [报告]
发表于 2009-02-01 17:13 |只看该作者
原帖由 jeanlove 于 2009-2-1 17:26 发表

难道虚表不是一个对象一个吗? 如果是静态的方在某个特定的地址上,对象只包含一个指向它的指针,那么就无法动态生成对各对象了呀!
虚表有多少个函数入口,对象就增加多大吧??

谢谢

虚表会增大。。。可是虚表的地址长度不会变啊

论坛徽章:
0
3 [报告]
发表于 2009-02-01 17:18 |只看该作者
函数物理上不包含在CLASS之内。

论坛徽章:
0
4 [报告]
发表于 2009-02-01 17:19 |只看该作者
(2)那个4是虚表指针吧?

论坛徽章:
0
5 [报告]
发表于 2009-02-01 17:23 |只看该作者
原帖由 思一克 于 2009-2-1 17:18 发表
函数物理上不包含在CLASS之内。

但是不是说虚函数表里面,每个虚函数对应一项吗? (就像c语言的struct包含几个函数指针一样),sizeof求得的大小应该增加吧?

谢谢

论坛徽章:
0
6 [报告]
发表于 2009-02-01 17:24 |只看该作者
原帖由 jeanlove 于 2009-2-1 17:23 发表

但是不是说虚函数表里面,每个虚函数对应一项吗? (就像c语言的struct包含几个函数指针一样),sizeof求得的大小应该增加吧?

谢谢

所以class里只要有一个虚函数表的指针就可以了

论坛徽章:
0
7 [报告]
发表于 2009-02-01 17:26 |只看该作者
原帖由 5毛党党员 于 2009-2-1 17:19 发表
(2)那个4是虚表指针吧?

难道虚表不是一个对象一个吗? 如果是静态的方在某个特定的地址上,对象只包含一个指向它的指针,那么就无法动态生成对各对象了呀!
虚表有多少个函数入口,对象就增加多大吧??

谢谢

论坛徽章:
0
8 [报告]
发表于 2009-02-01 17:27 |只看该作者
函数,虚的实的都不在CLASS里面。感觉在是编译层面的,不是物理真实。
如有函数指针,就占空间了。

原帖由 jeanlove 于 2009-2-1 17:23 发表

但是不是说虚函数表里面,每个虚函数对应一项吗? (就像c语言的struct包含几个函数指针一样),sizeof求得的大小应该增加吧?

谢谢

论坛徽章:
0
9 [报告]
发表于 2009-02-01 17:43 |只看该作者
父类只会保留一个指向虚表的指针,而虚表却可以变化,虚表里指向虚函数实现(这是要动态确定的),具体解释参见《深入浅出MFC》我记的不清
你可以试试用C继承B,然后在sizeof看看C的对象大小

论坛徽章:
0
10 [报告]
发表于 2009-02-01 17:44 |只看该作者
原帖由 5毛党党员 于 2009-2-1 17:29 发表

虚表会增大。。。可是虚表的地址长度不会变啊

OK, 我知道你的意思了

就是B类的对象b1包括两个域,一个是数据x, 另一个是指向虚表的指针。虚表指针的值是new的时候指定的类型所创建的,而那个类型究竟是谁,放在哪里就不是很重要了。那个虚表并不是实例的一部分,这个和用struct加几个函数指针的用法还不完全一样,两次跳转了。

另一个问题: 空对象占1个字节有什么实际意义吗? 谢谢5毛党党员dx
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP