StructLayout, FieldOffset & CPU Cache Line Alignment
1Concept
By default, the CLR reorders struct fields (`LayoutKind.Auto`) to maximize alignment. Using `[StructLayout(LayoutKind.Explicit)]` and `[FieldOffset]` enables union-like memory overlaps and prevents false sharing across 64-byte CPU cache lines.
2Architecture Diagram
Explicit 8-Byte Memory Union: ┌─────────────────────────┬─────────────────────────┐ │ Byte 0..3 (Integer A) │ Byte 4..7 (Integer B) │ [FieldOffset(0)] & [FieldOffset(4)] ├─────────────────────────┴─────────────────────────┤ │ 64-Bit UInt64 RawPayload │ [FieldOffset(0)] Overlapping view └───────────────────────────────────────────────────┘
3Code Example
C# 13 & .NET 9
using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Explicit)]
public struct FastUnion
{
[FieldOffset(0)] public ulong Raw64;
[FieldOffset(0)] public uint Low32;
[FieldOffset(4)] public uint High32;
}
public class StructLayoutDemo
{
public static void Main()
{
var u = new FastUnion { Raw64 = 0xAAAA_BBBB_CCCC_DDDD };
Console.WriteLine($"Full 64-bit: 0x{u.Raw64:X16}");
Console.WriteLine($"Low 32-bit: 0x{u.Low32:X8}");
Console.WriteLine($"High 32-bit: 0x{u.High32:X8}");
}
}4Expected Output
Full 64-bit: 0xAAAABBBBCCCCDDDD Low 32-bit: 0xCCCCDDDD High 32-bit: 0xAAAABBBB
5Key Takeaways
- ✓Align fields on natural boundaries (4-byte for int32, 8-byte for int64) to avoid unaligned CPU penalties.
- ✓CPUs fetch memory in 64-byte Cache Lines; pack related fields contiguously.
- ✓Use `Unsafe.SizeOf<T>()` for generic struct size queries.