https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87237
--- Comment #2 from Richard Smith <richard-gccbugzilla at metafoo dot co.uk> --- (In reply to Alexander Monakov from comment #1) > GCC assumes the access is sufficiently aligned for an atomic object of > corresponding type I think that's only true for objects whose size corresponds to that of a fundamental type. Consider: struct B { char c[3]; }; Here, an atomic object of type B (eg, _Atomic(B) or std::atomic<B>) would have size=4, align=4, and yet GCC treats B as having an alignment of 1 for the purpose of atomic accesses. Rather, GCC appears (from its external behavior) to consider only the object size and not the alignment for atomic accesses, and assumes power-of-2-sized objects to be aligned to their size (or to the maximum alignment of a fundamental type, whichever is lower). There exists code that assumes that GCC behaves as documented in this regard. For example, libc++'s std::atomic makes this assumption, and as a result, std::atomic<B> is not atomic when using gcc with libc++. For that reason, changing GCC to avoid the unwarranted alignment assumption seems superior to me to updating the documentation to match the behavior. (For what it's worth, I recently fixed Clang to behave per the GCC documentation in this regard; Clang used to fall back to a libcall for the underaligned case, but would mistakenly call the "optimized" library routines that assume the object is sufficiently aligned.)