Alignment
suggest changeIntroduction
All types in C++ have an alignment. This is a restriction on the memory address that objects of that type can be created within. A memory address is valid for an object’s creation if dividing that address by the object’s alignment is a whole number.
Type alignments are always a power of two (including 1).
Remarks
The standard guarantees the following:
- The alignment requirement of a type is a divisor of its size. For example, a class with size 16 bytes could have an alignment of 1, 2, 4, 8, or 16, but not 32. (If a class’s members only total 14 bytes in size, but the class needs to have an alignment requirement of 8, the compiler will insert 2 padding bytes to make the class’s size equal to 16.)
- The signed and unsigned versions of an integer type have the same alignment requirement.
- A pointer to
void
has the same alignment requirement as a pointer tochar
. - The cv-qualified and cv-unqualified versions of a type have the same alignment requirement.
Note that while alignment exists in C++03, it was not until C++11 that it became possible to query alignment (using alignof
) and control alignment (using alignas
).
Found a mistake? Have a question or improvement idea?
Let me know.
Table Of Contents