#### 6.58.8 Structure-Packing Pragmas

For compatibility with Microsoft Windows compilers, GCC supports a set of `#pragma` directives that change the maximum alignment of members of structures (other than zero-width bit-fields), unions, and classes subsequently defined. The n value below always is required to be a small power of two and specifies the new alignment in bytes.

1. `#pragma pack(`n`)` simply sets the new alignment.
2. `#pragma pack()` sets the alignment to the one that was in effect when compilation started (see also command-line option `-fpack-struct[=n]` see Code Gen Options).
3. `#pragma pack(push[,`n`])` pushes the current alignment setting on an internal stack and then optionally sets the new alignment.
4. `#pragma pack(pop)` restores the alignment setting to the one saved at the top of the internal stack (and removes that stack entry). Note that `#pragma pack([`n`])` does not influence this internal stack; thus it is possible to have `#pragma pack(push)` followed by multiple `#pragma pack(`n`)` instances and finalized by a single `#pragma pack(pop)`.

Some targets, e.g. i386 and PowerPC, support the `ms_struct` `#pragma` which lays out a structure as the documented `__attribute__ ((ms_struct))`.

1. `#pragma ms_struct on` turns on the layout for structures declared.
2. `#pragma ms_struct off` turns off the layout for structures declared.
3. `#pragma ms_struct reset` goes back to the default layout.