Moon_B 게임개발 공부 업적
[C#] [StructLayout] Attribute 본문
[StructLayout] Attribute
- 구조체나 클래스의 필드가 메모리에 어떻게 정렬될지(배치될지) 지정합니다.
매개변수 | 설명 |
---|---|
LayoutKind | 필드의 메모리 배치 방식을 지정합니다. (Sequential, Explicit, Auto) |
Pack | 필드 사이의 정렬 바이트를 지정합니다. 1이면 패딩 없이 딱 붙어 저장됩니다. (기본값은 8) |
- 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; }
- 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 | 필드 정렬 크기 지정 (패딩 컨트롤) |