Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

Moon_B 게임개발 공부 업적

[C#] [StructLayout] Attribute 본문

C#

[C#] [StructLayout] Attribute

Moon_B 2025. 4. 17. 13:58

[StructLayout] Attribute

  • 구조체나 클래스의 필드가 메모리에 어떻게 정렬될지(배치될지) 지정합니다.
매개변수 설명
LayoutKind 필드의 메모리 배치 방식을 지정합니다. (Sequential, Explicit, Auto)
Pack 필드 사이의 정렬 바이트를 지정합니다. 1이면 패딩 없이 딱 붙어 저장됩니다. (기본값은 8)
  1. Sequential
  • 정의된 순서대로 필드를 메모리에 배치합니다.
  • C/C++의 구조체와 호환이 좋습니다.
  • 일반적으로 가장 많이 사용되는 옵션입니다.
    [StructLayout(LayoutKind.Sequential)]
    struct MyStruct {
      public int A;
      public byte B;
      public short C;
    }

2, Explicit

  • 각 필드에 [FieldOffset]을 붙여 직접 오프셋을 명시적으로 지정해야 합니다.
  • 매우 정밀한 메모리 컨트롤이 필요한 경우 사용됩니다.
    [StructLayout(LayoutKind.Explicit)]
    struct MyExplicitStruct {
      [FieldOffset(0)] public int A;
      [FieldOffset(4)] public byte B;
    }
  1. Auto
  • CLR이 자동으로 배치하도록 합니다.
  • Interop에서는 사용하면 안 됨! (예측 불가한 배치 가능성 있음)

🔹 Pack 매개변수

  • 필드 간에 삽입되는 패딩(padding) 바이트를 최소화하거나 조절하기 위해 사용됩니다.
  • Pack = 1 은 1바이트 정렬을 의미하며, 패딩(빈 공간) 없이 꽉 채움.
    [StructLayout(LayoutKind.Sequential, Pack = 1)]
    struct PackedStruct {
      public byte A;     // 1 byte
      public int B;      // 4 bytes, but no padding due to Pack = 1
    }

✅ 요약

속성 설명
LayoutKind.Sequential 필드가 정의된 순서대로 정렬됨
LayoutKind.Explicit 필드 오프셋을 직접 지정함
LayoutKind.Auto 자동 정렬 (Interop 비권장)
Pack 필드 정렬 크기 지정 (패딩 컨트롤)