Class size in case of virtual inheritance

Can anyone explain the size of classes in case of virtual inheritance using virtual functions.

   class A{
          char k[ 3 ];
          public:
          virtual void a(){};
          };

   class B : public  A{
          char j[ 3 ];
          public:
          virtual  void b(){};
          };

   class C : public virtual A{
          char i[ 3 ];
          public:
          virtual void c(){};
          };

   class D : public B, public C{
          char h[ 3 ];
          public:
          virtual void d(){};
          };

Class size output:

    sizeof(A): 8
    sizeof(B): 12
    sizeof(C): 16
    sizeof(D): 32

The compiler I'm using gcc version 4.6.1 (Ubuntu/Linaro 4.6.1-9ubuntu3)

+3
source share
4 answers

sizeof (A): 8

3 bytes in the array, 1 byte strip, 4 bytes for vptr (pointer to vtable)

sizeof (B): 12

Subobject: 8, 3 bytes for an additional array, 1 byte strip

sizeof (C): 16

This is probably surprising for you ... Subobject: 8, 3 bytes for an additional array, 1 byte pad, 4 bytes of a pointer to A

, , , , . :

struct A {};
struct B : virtual A {};
struct C : virtual A {};
struct D : B, C {};

A B, B A B, D. , , , , A C C C D .

, ... Itanium ++ ABI ++. .


:

sizeof (D): 32

D B (12) C (16) 3 1.

, A, C A, , , , . B A, C .

, . A .

+4

sizeof(C) , sizeof(B), C ( A) ( vptr, B), , . , ( 10 ) 24: " , , RTTI" ++

+1

, , #pragma pack (1). , #pragma pack (push) #pragma pack ().

0

, :

              Avptr Bvptr CVptr DVptr k j i h k' j' i'  TOTAL
============= ========================================= =====
sizeof(A): 8    4                     4                   8
sizeof(B): 12        4                4 4                12
sizeof(C): 16              4          4 4 4              16
sizeof(D): 32                    4    4 4 4 4  4  4  4   32

:

  • vptrs 4 (64- )
  • char 4 ( )
  • k ', j' '- , C, B.
-1

All Articles