Does new char actually guarantee aligned memory for a class type?

c++, c++11, language-lawyer

Solution

What I'm missing is the bit which says `alignof(T)` will always be a valid alignment with a maximum value of `max_align_t`. I mean, it seems obvious, but must the resulting alignment of a structure be at most `max_align_t` ? Even point 3.11-3 says extended alignments may be supported, so may the compiler decide on its own a class is an over-aligned type ?

As noted by Mankarse, the best quote I could get is from [basic.align]/3:

A type having an extended alignment requirement is an over-aligned type. [ Note: every over-aligned type is or contains a class type to which extended alignment applies (possibly through a non-static data member). —end note ]

which seems to imply that extended alignment must be explicitly required (and then propagates) but cannot

I would have prefer a clearer mention; the intent is obvious for a compiler-writer, and any other behavior would be insane, still...

Problem

Is allocating a buffer via `new char[sizeof(T)]` guaranteed to allocate memory which is properly aligned for the type `T`, where all members of `T` has their natural, implementation defined, alignment (that is, you have not used the `alignas` keyword to modify their alignment). I have seen this guarantee made in a few answers around here but I'm not entirely clear how the standard arrives at this guarantee. 5.3.4-10 of the standard gives the basic requirement: essentially `new char[]` must be aligned to `max_align_t`. What I'm missing is the bit which says `alignof(T)` will always be a valid alignment with a maximum value of `max_align_t`. I mean, it seems obvious, but must the resulting alignment of a structure be at most `max_align_t`? Even point 3.11-3 says extended alignments may be supported, so may the compiler decide on its own a class is an over-aligned type?

Original source