BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #29261同步于 2009/9/29
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

【请教】虚继承的类大小

dongri
2009/9/29镜像同步10 回复
#include <iostream> using namespace std; class A { public: char a; }aa; class B:virtual public A { public: char b; }bb; class C:virtual public A { public: char c; }cc; class D:public B,public C { public: char d; }dd; sizeof(A) = 1 sizeof(B) = 9 sizeof(C) = 9 sizeof(D) = 21 最后一个不理解,B和C中虚指针,D中除了把B和C中的虚指针包括进来D自己还有虚指针吗?还有D中是不是只包含一份A::a?
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
dongri机器人#1 · 2009/9/29
说明一下,我在VC上试过了,输出就是 sizeof(A) = 1 sizeof(B) = 9 sizeof(C) = 9 sizeof(D) = 21
LOVEBABY机器人#2 · 2009/9/29
本版可搜索
jmpesp机器人#3 · 2009/9/29
这个问题其实很早就一直在讨论了,想当年我是讨论得相当激烈啊,哎,现在累了,多余的话就不说啦。推荐你看篇网上的文章 《逆向C++》文章名好像忘,应该差不多是这个名字
jokerlee机器人#4 · 2009/9/29
http://forum.byr.edu.cn/wForum/disparticle.php?boardName=CPP&ID=26843&pos=5
ImageP机器人#5 · 2009/9/29
1、 首先class A ,有一个 char a; 所以 sizeof(A) = 1; 2、 接着class B , class C 都是虚继承与 class A的所以, A的大小要保留; 由于class B, class C都有虚继承自class A 所以 B, C里面都有一个__vptr__B, __vptr__C, 他们的大小为int 的大小,也就是4bytes (Win32系统下) 其次是B, C里面有一个自己的数据成员, 及占 1byte. 但是对于编译器来说, 需要内存对齐;( 你可能为什么A不需要对齐, 那是因为它的数据成员的大小都小于int) 所以B, C的大小为: sizeof( B ) = 1 + 4 + 1 + 3 ( 最后一个 3 是内存对齐所需的大小) 3、 class D 继承B, C 而B, C是虚继承自 A, 所以D中只有一个A的数据成员 对于D 中要存有 B, C的subobject . 再者就是D自身的一个char 占一个字符 (但是也得内存对齐 , 所以要加 3 ) 因此 sizeof( D ) = sizeof (A) + [ sizeof( B ) - sizeof(A) ] + [ sizeof( C ) - sizeof( A) ] + 1 + 3 ; 不知道你现在有没有明白, 如果还是没有的话, qq: 272015303 联系! 【 在 dongri 的 大作中提到: 】 #include <iostream> using namespace std; class A { public: char a; }aa; class B:virtual public A { public: char b; }bb; class C:virtual public A { public: char c; }cc; class D:public B,public C { public: char d; }dd; sizeof(A) = 1 sizeof(B) = 9 sizeof(C) = 9 sizeof(D) = 21 最后一个不理解,B和C中虚指针,D中除了把B和C中的虚指针包括进来D自己还有虚指针吗?还有D中是不是只包含一份A::a?
ImageP机器人#6 · 2009/9/29
提示: B 再继承 A 的时候, 是将A作为整体看的, 不作B的内存对齐处理, 即 : A存于 B 的subobject 部分!
dongri机器人#7 · 2009/9/30
1、 首先class A ,有一个 char a; 所以 sizeof(A) = 1; 2、 接着class B , class C 都是虚继承与 class A的所以, A的大小要保留; 由于class B, class C都有虚继承自class A 所以 B, C里面都有一个__vptr__B, __vptr__C, 他们的大小为int 的大小,也就是4bytes (Win32系统下) 其次是B, C里面有一个自己的数据成员, 及占 1byte. 但是对于编译器来说, 需要内存对齐;( 你可能为什么A不需要对齐, 那是因为它的数据成员的大小都小于int) 所以B, C的大小为: sizeof( B ) = 1 + 4 + 1 + 3 ( 最后一个 3 是内存对齐所需的大小) 3、 class D 继承B, C 而B, C是虚继承自 A, 所以D中只有一个A的数据成员 对于D 中要存有 B, C的subobject . 再者就是D自身的一个char 占一个字符 (但是也得内存对齐 , 所以要加 3 ) 因此 sizeof( D ) = sizeof (A) + [ sizeof( B ) - sizeof(A) ] + [ sizeof( C ) - sizeof( A) ] + 1 + 3 ; 这个加三是因为D中的数据成员含vptr_B和vptr_C?要跟这个对齐?
windam机器人#8 · 2009/9/30
把内存对齐去了你会看的更清楚: #include <iostream> #pragma pack(1) using namespace std; class A { public: char a; }aa; class B:virtual public A { public: char b; }bb; class C:virtual public A { public: char c; }cc; class D:public B,public C { public: char d; }dd; int _tmain(int argc, _TCHAR* argv[]) { cout<<sizeof(A)<<endl; cout<<sizeof(B)<<endl; cout<<sizeof(C)<<endl; cout<<sizeof(D)<<endl; return 0; } Output: 1 6 6 12
sym机器人#9 · 2009/10/4
直接运行会出错 请问_tmain(int argc, _TCHAR* argv[]) 中的参数是什么意思??