This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: RFC: attribute "unpadded"




--On Tuesday, August 27, 2002 03:10:00 AM +0100 Jamie Lokier <egcs@tantalophile.demon.co.uk> wrote:

Mark Mitchell wrote:
This comes up in C++ like so:

  struct A { virtual void f();  char c; };
  struct B : public A { char c2 };
Here in C++, `sizeof(struct A)' is 8, and `sizeof(struct B)' is also 8.

Here, the size of B is 8, not 12, because "c2" is packed into
the tail padding of A.  If A were "unpadded", you could express
this in C as:

  struct A __attribute__((unpadded)) { void *vptr; char c; };
  struct B { struct A __base; char c2; };
This does _not_ express the same thing in C, because this C version of
`sizeof(struct A)' is 5.
You're correct -- but that's not how you would map the C++ ABI onto C.

In C, you would need two versions of each class type; the type when it
is used as a base class, and the type when it is a complete object.

So, you would do this:

 struct A { void *vptr; char c; };
 struct A_as_base __attribute__((unpadded)) { void *vptr; char c; };
 struct B { struct A_as_base __base; char c2; };

Then everything matches up.

You need to have two versions of each class because the base version
needs to omit virtual base classes.

--
Mark Mitchell                mark@codesourcery.com
CodeSourcery, LLC            http://www.codesourcery.com


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]