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~

Reply via email to