This field indicates memory boundaries that should be used when the LayoutKind..::.Sequential value is specified.
The value of Pack must be 0, 1, 2, 4, 8, 16, 32, 64, or 128. A value of 0 indicates that the packing alignment is set to the default for the current platform. A value of 1 indicates that data alignment occurs on byte boundaries. There are no gaps between fields with a packing value of 1.
Packing values of 2 and higher will cause each field to be aligned on a byte offset relative to the beginning of the structure. As such, data fields will start on offsets that are multiples of the requested packing value.
The following code sample contains a structure with three one-byte fields:
struct MyStruct
{
byte B0;
byte B1;
byte B2;
}
Byte B0 always starts at offset 0 (byte 0). A packing value of 0 will cause byte B1 to start at offset 0 (byte 0). Byte B1 will begin at offset 1 (byte 1), and byte B2 will begin at offset 2 (byte 2), because the default platform alignment will always contiguously pack identical types.
A packing value of 1 will produce the following:
B0 will still begin at offset 0 (byte 0).
B1 will still begin at offset 1 (byte 1).
B2 will still begin at offset 2 (byte 2).
However, a packing value of 2 will produce the following:
B0 will still begin at offset 0 (byte 0).
B1 will begin at offset 2 (byte 2).
B3 will begin at offset 4 (byte 4).
The Pack attribute is frequently used when structures are exported during disk and network writes. The attribute is also frequently used during p/invoke and interop operations.
Occasionally the attribute is used to produce a tighter packing size, and thus reduce memory requirements. This type of usage requires careful consideration of actual hardware constraints, and may actually degrade performance.