On 03/25/2015 09:22 AM, Jonathan Wakely wrote:
> private:
> - _Tp _M_i;
> + // Align 1/2/4/8/16-byte types the same as integer types of that size.
> + // This matches the alignment effects of the C11 _Atomic qualifier.
> + static constexpr int _S_alignment
> + = sizeof(_Tp) == sizeof(char) ? alignof(char)
> + : sizeof(_Tp) == sizeof(short) ? alignof(short)
> + : sizeof(_Tp) == sizeof(int) ? alignof(int)
> + : sizeof(_Tp) == sizeof(long) ? alignof(long)
> + : sizeof(_Tp) == sizeof(long long) ? alignof(long long)
> +#ifdef _GLIBCXX_USE_INT128
> + : sizeof(_Tp) == sizeof(__int128) ? alignof(__int128)
> +#endif
> + : alignof(_Tp);
> +
> + alignas(_S_alignment) _Tp _M_i;
Surely not by reducing a larger alignment applied to _Tp.
I.e.
static constexpr int _S_min_alignment
= sizeof(_Tp) == sizeof(char) ? alignof(char)
: sizeof(_Tp) == sizeof(short) ? alignof(short)
: sizeof(_Tp) == sizeof(int) ? alignof(int)
: sizeof(_Tp) == sizeof(long) ? alignof(long)
: sizeof(_Tp) == sizeof(long long) ? alignof(long long)
#ifdef _GLIBCXX_USE_INT128
: sizeof(_Tp) == sizeof(__int128) ? alignof(__int128)
#endif
: 0;
static constexpr int _S_alignment
= _S_min_alignment > alignof(_Tp) ? _S_min_alignment : alignof(_Tp);
r~