Boost logo

Boost :

Subject: Re: [boost] boost::aligned_storage broken on VC12 for alignment values of 8
From: John Maddock (boost.regex_at_[hidden])
Date: 2014-04-24 08:22:29


>> AFAIK, with Windows 32-bit, you cannot reliably have an object with
>> alignment greater than 4 on the stack.
>>
>
> I have seen that VC has notoriously strange alignment and layout rules
> for 32-bit code. I wonder if that should inhibit making
> boost::aligned_storage<..., N>::type at least as reliable as VC12's
> std::aligned_storage<..., N>::type or __declspec(align(8)), both of
> which seem to work correctly.

Sorry to be so late in coming to this: this is both nasty but also
apparently unfixable, on the one hand, VC++ basically lies about the
alignment of some types:

int main(int argc, _TCHAR* argv[])
{
    typedef long long align_t;
    std::cout << __alignof(align_t) << std::endl;
    assert(__alignof(align_t) % 8 == 0); // OK
    align_t a;
    assert(((std::uintptr_t)&a % 8) == 0); // OK
    char c = 0;
    align_t a1;
    assert(((std::uintptr_t)&a1 % 8) == 0); // Fails
    return 0;
}

BTW this is true also of std::aligned_storage which also fails the final
assert above. If instead we had:

typedef __declspec(align(8)) struct some_struct_type align_t;

Then the asserts all pass, but now align_t can not be passed through a
function call by value. In fact this was a previous bug in the type
traits lib: http://article.gmane.org/gmane.comp.lib.boost.devel/173011

So we're basically screwed whatever we do.

Regards, John.


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