关于类的大小

孟如庭 2016-01-14 05:18:08

以下代码,为什么D 的大小是8字节呢?

多重继承的G,无虚函数,4字节(子类有个INT),如如INT,就是1
多重继承的I,有虚函数,也是4字节。
D和I的区别就是,带虚函数的子类是否有继承,为什么就不一样呢??求教方家
class a {};

class b{};

class c:public a{
virtual void fun()=0;
};

class d:public b,public c{};
//SIZE 8

//class d:public b{};
//SIZE 1

//class d:public c{};
//SIZE 4
class E:public a,public b
{
//SIZE 1
};

class F
{
int i;
};
class G:public a,public F
{
//SIZE 4
};

class H
{
virtual void fun();
};
class I:public a,public H
{
//SIZE 4
};
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;
cout<<"sizeof(e)"<<sizeof(E)<<endl;
cout<<"sizeof(G)"<<sizeof(G)<<endl;
cout<<"sizeof(H)"<<sizeof(H)<<endl;
cout<<"sizeof(I)"<<sizeof(I)<<endl;
return 0;
}
...全文
463 23 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
孟如庭 2016-01-21
  • 打赏
  • 举报
回复
引用 22 楼 y249077293 的回复:
[quote=引用 21 楼 feiyue1206 的回复:] [quote=引用 18 楼 y249077293 的回复:] ##win10 + visual studio2015测试结果为4;g++4.8测试结果为8;没得意义,真的没得意思;回家过年去了 class A{}; class B{ virtual void foo(){} }; class D : public A, public B { };
恩。看来不同的编译器实现不一样。我好奇的是你这个图是怎么出来的??[/quote] 搜 visual studio 对象内存分布[/quote] 谢谢
也已时过境迁 2016-01-20
  • 打赏
  • 举报
回复
引用 21 楼 feiyue1206 的回复:
[quote=引用 18 楼 y249077293 的回复:] ##win10 + visual studio2015测试结果为4;g++4.8测试结果为8;没得意义,真的没得意思;回家过年去了 class A{}; class B{ virtual void foo(){} }; class D : public A, public B { };
恩。看来不同的编译器实现不一样。我好奇的是你这个图是怎么出来的??[/quote] 搜 visual studio 对象内存分布
赵4老师 2016-01-18
  • 打赏
  • 举报
回复
//就算你对sizeof(classA),sizeof(classB)烂熟于胸、胸有成竹、胸大无脑、(.Y.)、(.)(.)……

//你还是不敢
if (sizeof(classB)==sizeof(classA)) memcpy(&classB,&classA,sizeof(classA));

孟如庭 2016-01-18
  • 打赏
  • 举报
回复
引用 18 楼 y249077293 的回复:
##win10 + visual studio2015测试结果为4;g++4.8测试结果为8;没得意义,真的没得意思;回家过年去了 class A{}; class B{ virtual void foo(){} }; class D : public A, public B { };
恩。看来不同的编译器实现不一样。我好奇的是你这个图是怎么出来的??
  • 打赏
  • 举报
回复
空类没有数据,应该是0,但是标准规定不能是0,所以修正为1 所以a是1,b是1 c继承a带有虚函数,所以a是0,所以c的大小是4,就是虚函数表的指针 d继承b和c,因此内存中需要有分别有b和c的位置,所以就是b(1内存对其为4)+c(4)=8
也已时过境迁 2016-01-16
  • 打赏
  • 举报
回复
##win10 + visual studio2015测试结果为4;g++4.8测试结果为8;没得意义,真的没得意思;回家过年去了

class A{};
class B{
virtual void foo(){}
};
class D : public A, public B {
};
ztenv 版主 2016-01-16
  • 打赏
  • 举报
回复
建议这种问题直接略过,个人认为没有什么太大的意义,还不如考虑考虑sizeof(struct XX)的问题;
paschen 版主 2016-01-16
  • 打赏
  • 举报
回复
引用 16 楼 feiyue1206 的回复:
[quote=引用 15 楼 paschen 的回复:] D包含基类B与基类C两个部分,虽然一个是1,一个是4,但对齐后将变成8
看下I吧。 多重继承的I,有虚函数,也是4字节。两个基类,一个1,一个4,I==4. D和I的区别就是,带虚函数的子类是否有继承,为什么就不一样呢? [/quote] 如果不是虚函数,而比如是一个int成员,同样有你说的情况 具体我没仔细去研究 你可看一下这个文章:http://blog.csdn.net/seizef/article/details/6168721 另外《深度探索C++对象模型》中第3章开篇也就这进行了一番探讨,楼主可以看一下
孟如庭 2016-01-16
  • 打赏
  • 举报
回复
引用 15 楼 paschen 的回复:
D包含基类B与基类C两个部分,虽然一个是1,一个是4,但对齐后将变成8
看下I吧。 多重继承的I,有虚函数,也是4字节。两个基类,一个1,一个4,I==4. D和I的区别就是,带虚函数的子类是否有继承,为什么就不一样呢?
paschen 版主 2016-01-16
  • 打赏
  • 举报
回复
D包含基类B与基类C两个部分,虽然一个是1,一个是4,但对齐后将变成8
孟如庭 2016-01-16
  • 打赏
  • 举报
回复
引用 12 楼 paschen 的回复:
看《深度探索C++对象模型》 如果整个类没有任何成员,为了在内存中表示,会有1个字节的大小 如果类继承后已经有成员,就不会有这1个字节了 另外如果有虚函数,那么将会有一个虚表指针,所以会多4的大小
这些我知道,但是还是解释不了主贴中D=8的问题。。。
paschen 版主 2016-01-15
  • 打赏
  • 举报
回复
看《深度探索C++对象模型》 如果整个类没有任何成员,为了在内存中表示,会有1个字节的大小 如果类继承后已经有成员,就不会有这1个字节了 另外如果有虚函数,那么将会有一个虚表指针,所以会多4的大小
赵4老师 2016-01-15
  • 打赏
  • 举报
回复
不要迷信书、考题、老师、回帖; 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实! 有人说一套做一套,你相信他说的还是相信他做的? 其实严格来说这个世界上古往今来所有人都是说一套做一套,不是吗? 不要写连自己也预测不了结果的代码!
孟如庭 2016-01-14
  • 打赏
  • 举报
回复
引用 8 楼 D41D8CD98F 的回复:
明明 sizeof(d) 和 sizeof(I) 都是8 http://coliru.stacked-crooked.com/a/41353ce30de61432
而且C是8的话,应该是用了64位编译器?
孟如庭 2016-01-14
  • 打赏
  • 举报
回复
引用 8 楼 D41D8CD98F 的回复:
明明 sizeof(d) 和 sizeof(I) 都是8 http://coliru.stacked-crooked.com/a/41353ce30de61432
win8+ vs2008/vs2013,和这个结果不一致
D41D8CD98F 2016-01-14
  • 打赏
  • 举报
回复
明明 sizeof(d) 和 sizeof(I) 都是8 http://coliru.stacked-crooked.com/a/41353ce30de61432
语法错误 2016-01-14
  • 打赏
  • 举报
回复
D里面什么东西都没有,只是继承了两个类
苏叔叔 2016-01-14
  • 打赏
  • 举报
回复
不要太纠结,这个问题不太重要。
孟如庭 2016-01-14
  • 打赏
  • 举报
回复
我是vs 2008,vs2013,结果都是一样的
lilianjie001 2016-01-14
  • 打赏
  • 举报
回复
可能是字节对齐的原因
加载更多回复(3)

65,184

社区成员

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

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