Boost logo

Boost :

From: Martin Bonner (martin.bonner_at_[hidden])
Date: 2006-03-07 05:42:20


----Original Message----
From: Emile Cormier

> The bitfield mechanism relies on this assumption: Unions of
> non-polymorphic, non-derived objects, having the exact same underlying
> data member type, will have the same size as this underlying data
> member type. I'm no language lawyer, so please let me know if this is
> a safe and portable assumption.

I'm not quite sure what you mean, but given:
        struct a { unsigned char ch; };
        struct b { unsigned char ch; };
        union u { a theA; b theB };
then you are not guaranteed that sizeof(u) == sizeof(unsigned char).

On word addressed machines (which /are/ still being built), it is almost
certain that the minimum size for a struct is a complete word. This is
because the C and C++ standards effectively promise that pointers to
structs are all of the same size (the size of a pointer-to-struct does
not depend on the contents of the struct). It is desirable that a
pointer-to-struct be the smaller, cheaper-to-dereference pointer to word
(rather than the larger more-expensive-to-dereference pointer to char),
so the smallest struct has to occupy a whole word.

HOWEVER, if your structures and unions are using unsigned char, why not
just use "unsigned char *" instead? If you are using unsigned short (or
longer types), then you are almost certain to be safe. It is not
guaranteed by the standard; a compiler /can/ pad all structures to 256
bits if it wants to, but in practise compilers don't.

-- 
Martin Bonner
Martin.Bonner_at_[hidden]
Pi Technology, Milton Hall, Ely Road, Milton, Cambridge, CB4 6WZ,
ENGLAND Tel: +44 (0)1223 203894

Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk