The keyword __alignof__ determines the alignment requirement of a function, object, or a type, or the minimum alignment usually required by a type. Its syntax is just like sizeof and C11 _Alignof.
For example, if the target machine requires a double value to be aligned on an 8-byte boundary, then __alignof__ (double) is 8. This is true on many RISC machines. On more traditional machine designs, __alignof__ (double) is 4 or even 2.
Some machines never actually require alignment; they allow references to any data type even at an odd address. For these machines, __alignof__ reports the smallest alignment that GCC gives the data type, usually as mandated by the target ABI.
If the operand of __alignof__ is an lvalue rather than a type, its value is the required alignment for its type, taking into account any minimum alignment specified by attribute aligned (see Common Variable Attributes). For example, after this declaration:
struct foo { int x; char y; } foo1;
the value of __alignof__ (foo1.y) is 1, even though its actual alignment is probably 2 or 4, the same as __alignof__ (int). It is an error to ask for the alignment of an incomplete type other than void.
If the operand of the __alignof__ expression is a function, the expression evaluates to the alignment of the function which may be specified by attribute aligned (see Common Function Attributes).
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-9.2.0/gcc/Alignment.html