Applications should generally align structure members at addresses that are “natural” for the data type and the processor involved. For example, a 4-byte data member should have an address that is a multiple of four.
This principle is especially important when you write code for porting to multiple processors. A misaligned 4-byte data member, which is on an address that is not a multiple of four, causes a performance penalty with an 80386 processor and a hardware exception with a MIPS® RISC processor. In the latter case, although the system handles the exception, the performance penalty is significantly greater.
The following guidelines ensure proper alignment for processors targeted by Win32:
Type | Alignment |
char | Align on byte boundaries |
short (16-bit) | Align on even byte boundaries |
int and long (32-bit) | Align on 32-bit boundaries |
float | Align on 32-bit boundaries |
double | Align on 64-bit boundaries |
structures | Largest alignment requirement of any member |
unions | Alignment requirement of the first member |
The compiler automatically aligns data in accordance with these requirements, inserting padding in structures up to the limit (default pack size) specified by the /Zp option or #pragma pack. For example, /Zp2 permits up to 1 byte of padding, /Zp4 permits up to 3 bytes of padding, and so on. The default pack size for Windows 3.x is 2, whereas the default for Win32 is 8. As a consequence: