On 25/03/15 11:36 -0700, Richard Henderson wrote:
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);
Doh, good catch. I'll make that change and add a test with a type that
has alignof(X) > sizeof(X).
On 25/03/15 11:39 -0700, Richard Henderson wrote:
On 03/25/2015 09:22 AM, Jonathan Wakely wrote:
+static_assert( alignof(std::atomic<twoints>) > alignof(int),
+ "std::atomic not suitably aligned" );
This is only true if int64_t has alignment larger than int32_t,
which is unfortunately not always the case.
Huh, didn't realise that. I could change the tests to check it's
alignof(std::int64_t) as the next assertion does, but is it safe to
assume that struct twoints { int a; int b; } is exactly 64 bits
everywhere?
I'd prefer not to have the test say "if sizeof(twoints) ==
sizeof(long), test this, otherwise if sizeof(twoints) == ..."