2009-11-29 7 views
3

기본적으로 C#의 구조체는 [StructLayout(LayoutKind.Sequential)]으로 구현됩니다. 기본적으로 이러한 유형의 개체는 일반적으로 COM Interop에 사용되며 해당 필드는 정의 된 순서대로 유지되어야합니다. 클래스에는 LayoutKind.Auto이 정의되어 있습니다.Shoud COM Interop에서 수행하지 않으면 내 구조체에 LayoutKind.Auto를 사용합니까?

제 질문은 명시 적으로 구조체를 [StructLayout(LayoutKind.Auto)]으로 지정해야하며 이것이 기본 설정보다 어떤 이점도 있습니까? 즉, 구조체가 스택으로 초기화되면 어떤 차이가 있습니까? 즉 GC은 구조체를 이동할 필요가 없습니다. 또한 구조체가 힙에서 초기화 될 때 도움이 될 것입니다 - 즉 일부 클래스의 일부입니까?

답변

2

내가 생각할 수있는 유일한 이점은 구조체의 메모리 사용량이 적다는 것입니다. 하지만 당신은 처음에 그러한 큰 구조체를 가지고 있다면 일 것입니다. 아마도 리팩터링을해야합니다.

는 잠재적 인 문제는 어떻게 예상대로 바이트의 순서가 될 것입니다 보장 할 수 있습니다, 당신의 structMarshal.PtrToStructure를 사용 byte[]에 당신이 마샬 원하는 것이 무엇입니까?

이 작업을 수행하는 것만으로도 해결할 수있는 것보다 더 많은 문제가 발생할 수 있습니다 ... 의 필드 순서가 인 경우 그럴 수는 있지만 염두에 두어야합니다. 혼자 오는 다음 사람이 그것을 기대하지 않을 수도 있습니다.

+0

제프리 리히터 (Jeffrey Richter)는 C# 2를 통한 CLR에서 COM Interop과 같은 마샬링 시나리오에서 사용되지 않는 구조체에 대해 Layout.Auto를 설정하도록 권장합니다. 이것은 주로 내가이 질문을 한 이유입니다. –

+0

내가 준 예제는 COM Interop과 관련이 없으며 이진 직렬화의 일부 형식 일 수 있습니다. – ParmesanCodice

1

많은 일을한다고는 생각하지 않지만 혜택을 줄 수도 있습니다. 나는 보통 과태를 고수한다.

기본적으로 자동 레이아웃을 사용하면 CLR에서 데이터를 정렬하는 방법을 선택할 수 있으므로 속도에 대한 공간적 균형을 조정할 수 있습니다 (플랫폼에 따라 달라지기 때문에 일을 정렬하면 일부는 더 중요 할 수 있습니다) . 그러나 구조체가 스택이나 복합 도우미 구조 (KeyValuePair 생각)로 종종 사용되기 때문에 순차는 일반적으로 기본으로 이해됩니다.