Boost logo

Boost :

From: David Abrahams (dave_at_[hidden])
Date: 2005-11-10 11:47:45


Michael Shepanski <mshepanski_at_[hidden]> writes:

> Hello again. I'd like to reawaken this thread because It didn't seem to
> reach a conclusion, and the bug that started it continues to cause me pain.
>
>
> On 10/29/05, Fernando Cacciola <fernando_cacciola_at_[hidden]> wrote:
>>
>>
>> As Martin Bonner suggested, one solution is to factorize the result of
>> alignment_of<> so it returns not just any multiple. Unfortunately, we
>> can't
>> say that the alignment _ought_ to be a power of 2 can we?
>>
>> An alternative solution that, at least, would work with this very specific
>> example, is to compute it as the minimun of sizeof(charT)-sizeof(T) and
>> sizeof(Tchar)-sizeof(T)
>> That is, adding the char both before and after, and taking the least
>> difference.
>
>
>
> These both sound like interesting solutions; what do others think?
> Are they theoretically correct?

The second one certainly won't work. It's very possible that
sizeof(Tchar) - sizeof(T) is zero, while T may still have alignment
requirements.

The first one isn't theoretically correct, because an arbitrary
machine might have non-power-of-2 alignments. However, it's very
likely to work for on any machine we target in the forseeable future.

> A policy question: what happens if no theoretically correct solution
> is found? Would boost::optional then be discontinued?

Of course not.

> Or would it be reimplemented in a way that happens to work on all
> popular platforms?

That's what we do now. Except that someone found a case where it
fails.

> Or would it switch at compile-time between
> overtly platform-specific implementations?

How to address it is up to the maintainer.

> I do hope that the policy is not to keep the current solution until a
> theoretically correct solution is comes to light.

I doubt it, because there is no such solution.

> Not to put too fine a point on it, the current solution is
> theoretically incorrect too; the only thing that distinguishes it
> from other theoretically incorrect solutions that have been
> discussed is that this one fails in practice.

That's one way to look at it. The other way is to say that it refuses
to silently return a wrong answer, preferring instead to cause a
compile-time error so we will notice the problem and have this
discussion about addressing it. I think that even if we take the
biggest factor of 2 that evenly divides the detected alignment, it's
still possible to come out with a number so large that none of the
fundamental types we use to force alignment will handle it. I hope in
that case we'll continue to produce a compile-time error.

-- 
Dave Abrahams
Boost Consulting
www.boost-consulting.com

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