Boost logo

Boost :

Subject: Re: [boost] How do I specify no padding bytes within a struct/class?
From: Jonathan Wakely (jwakely.boost_at_[hidden])
Date: 2013-06-20 04:25:49


On 20 June 2013 06:36, Daryle Walker wrote:
> -----Original Message-----
> From: Jonathan Wakely
> Sent: Tuesday, June 18, 2013 5:28 AM
>
>>On 17 June 2013 22:30, Daryle Walker wrote:
>>> template < typename T, unsigned R > struct complex_rt;
>>>
>>> template < typename T >
>>> struct complex_rt<T, 0u> { T r; };
>>>
>>> template < typename T, unsigned R >
>>> struct complex_rt { complex_rt<T, R - 1u> b[2]; };
>>>
>>> will have padding all over the place if there's any trailing padding at a
> lower level.
>>
>>But why would it have padding at a lower level?
>>
>>On a sane implementation complex_rt<T,0> will have the same layout as
>>T, so an array of them will have the same layout as an array of T, ...
>>*unless* you start dicking about with alignment and padding by overriding
> >the compiler's decisions, at which point you might break things.
>
> I want the code to work on non-sane implementations too, when possible. A
> common case that might happen is when the element size is less than a word
> ("char," for example). The struct may be padding-filled to reach a word
> boundary.

Your original mail indicated you want to turn on packed structs for
all compilers that support it, not just the insane ones :-)

>>I agree that it would be better to simply use a static_assert to check the
>>layout meets your requirements, and only force something different if
>>needed.
>
> I don't want a hard error. I've actually implemented a "constexpr" class
> constant to indicate if a particular class has padding. I was surprised
> that I could use an expression with "sizeof(MyClass)" within MyClass. I
> experimented and found out the compiler was smart about it; it won't
> complain when using the size of a class within that class if it's for
> something class-static or otherwise won't affect itself; using something
> like a non-static member "char x[sizeof(MyClass)]" does flag an error.

The hard error would let you find out which compilers need special
handling, if any.


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