Controlling alignment
suggest changeThe alignas
keyword can be used to force a variable, class data member, declaration or definition of a class, or declaration or definition of an enum, to have a particular alignment, if supported. It comes in two forms:
alignas(x)
, wherex
is a constant expression, gives the entity the alignmentx
, if supported.alignas(T)
, whereT
is a type, gives the entity an alignment equal to the alignment requirement ofT
, that is,alignof(T)
, if supported.
If multiple alignas
specifiers are applied to the same entity, the strictest one applies.
In this example, the buffer buf
is guaranteed to be appropriately aligned to hold an int
object, even though its element type is unsigned char
, which may have a weaker alignment requirement.
alignas(int) unsigned char buf[sizeof(int)];
new (buf) int(42);
alignas
cannot be used to give a type a smaller alignment than the type would have without this declaration:
alignas(1) int i; //Il-formed, unless `int` on this platform is aligned to 1 byte.
alignas(char) int j; //Il-formed, unless `int` has the same or smaller alignment than `char`.
alignas
, when given an integer constant expression, must be given a valid alignment. Valid alignments are always powers of two, and must be greater than zero. Compilers are required to support all valid alignments up to the alignment of the type std::max_align_t
. They may support larger alignments than this, but support for allocating memory for such objects is limited. The upper limit on alignments is implementation dependent.
C++17 features direct support in operator new
for allocating memory for over-aligned types.