Phase 2 of 30 · Topic 2.2

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.