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).
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 to
- 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
This modified text is an extract of the original Stack Overflow Documentation created by following contributors
and released under CC BY-SA 3.0