#pragma pack
instructs the compiler to pack structure members with particular alignment. Most compilers, when you declare a struct, will insert padding between members to ensure that they are aligned to appropriate addresses in memory (usually a multiple of the type's size). This avoids the performance penalty (or outright error) on some architectures associated with accessing variables that are not aligned properly. For example, given 4-byte integers and the following struct:
struct Test
{
char one;
int two;
char three;
};
The compiler could choose to lay the struct out in memory like this:
Bytes: | 1 | 2 3 4 | 5 6 7 8 | 9 | 10 11 12 |
Member: | one | padding | two | three | padding |
and sizeof(Test)
would be 12, even though it only contains 6 bytes of data. The most common use case for the #pragma
(to my knowledge) is when working with hardware devices where you need to ensure that the compiler does not insert padding into the data and each member follows the previous one. With #pragma pack(1)
, the struct above would be laid out like this:
Bytes: | 1 | 2 3 4 5 | 6 |
Member: | one | two | three |
And sizeof(Test)
would be 6.