$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
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.