64,683
社区成员
发帖
与我相关
我的任务
分享
class A
{
private :
int a;
public :
virtual int getData();
};
class B : public virtual A
{
private :
int b; //-----------------------------------------(1)
public :
virtual void bb();
};
class C : public virtual B
{
public :
virtual void cc();
};
int main(int argc, char* argv[])
{
cout<<sizeof(A)<<endl; // 8
cout<<sizeof(B)<<endl; // 16
cout<<sizeof(C)<<endl; // 20
return 0;
}
//int b; //-----------------------------------------(1)
class A size(8):
+---
0 | {vfptr}
4 | a
+---
class B size(16):
+---
0 | {vfptr}
4 | {vbptr}
+---
+--- (virtual base A)
8 | {vfptr}
12 | a
+---
class C size(24):
+---
0 | {vfptr}
4 | {vbptr}
+---
+--- (virtual base A)
8 | {vfptr}
12 | a
+---
+--- (virtual base B)
16 | {vfptr}
20 | {vbptr}
+---
但是,我不明白的是gcc是怎么实现这个的? 跟vc有很大不同。下面是gcc结果:
Class A
size=8 align=4
base size=8 base align=4
A (0xb74835a0) 0
vptr=((& A::_ZTV1A) + 8u)
Class B
size=12 align=4
base size=4 base align=4
B (0xb6b2d700) 0 nearly-empty
vptridx=0u vptr=((& B::_ZTV1B) + 12u)
A (0xb6a854ec) 4 virtual
vptridx=4u vbaseoffset=-0x00000000c vptr=((& B::_ZTV1B) + 28u)
Class C
size=12 align=4
base size=4 base align=4
C (0xb6b2d780) 0 nearly-empty
vptridx=0u vptr=((& C::_ZTV1C) + 20u)
B (0xb6b2d7c0) 0 nearly-empty virtual
primary-for C (0xb6b2d780)
subvttidx=12u vptridx=4u vbaseoffset=-0x000000014
A (0xb6a85528) 4 virtual
vptridx=8u vbaseoffset=-0x00000000c vptr=((& C::_ZTV1C) + 40u)
cl /nologo /EHsc /d1reportAllClassLayout test.cpp
class A size(16):
+---
0 | {vfptr}
8 | a
| <alignment member> (size=4)
+---
A::$vftable@:
| &A_meta
| 0
0 | &A::getData
A::getData this adjustor: 0
class B size(40):
+---
0 | {vfptr}
8 | {vbptr}
16 | b
| <alignment member> (size=4)
+---
+--- (virtual base A)
24 | {vfptr}
32 | a
| <alignment member> (size=4)
+---
B::$vftable@B@:
| &B_meta
| 0
0 | &B::bb
B::$vbtable@:
0 | -8
1 | 16 (Bd(B+8)A)
B::$vftable@A@:
| -24
0 | &A::getData
B::bb this adjustor: 0
vbi: class offset o.vbptr o.vbte fVtorDisp
A 24 8 4 0
class C size(56):
+---
0 | {vfptr}
8 | {vbptr}
+---
+--- (virtual base A)
16 | {vfptr}
24 | a
| <alignment member> (size=4)
+---
+--- (virtual base B)
32 | {vfptr}
40 | {vbptr}
48 | b
| <alignment member> (size=4)
+---
C::$vftable@:
| &C_meta
| 0
0 | &C::cc
C::$vbtable@C@:
0 | -8
1 | 8 (Cd(C+8)A)
2 | 24 (Cd(C+8)B)
C::$vftable@A@:
| -16
0 | &A::getData
C::$vftable@B@:
| -32
0 | &B::bb
C::$vbtable@B@:
0 | -8
1 | -24 (Cd(B+8)A)
C::cc this adjustor: 0
vbi: class offset o.vbptr o.vbte fVtorDisp
A 16 8 4 0
B 32 8 8 0