[유니티/C#] StructLayout(LayoutKind.Sequential, Size = 12)

프로그래밍/유니티2018. 4. 16. 15:18

안녕하세요. 개발자 드리머즈입니다.


1
2
3
4
5
6
// Define the structure to be sequential and with the correct byte size (3 ints = 4 bytes * 3 = 12 bytes)
[StructLayout(LayoutKind.Sequential, Size = 12)]
public struct CvCircle
{
    public int X, Y, Radius;
}
cs

유니티의 C# 코드에서 [StructLayout(LayoutKind.Sequential, Size = 12)]를 처음봐서 뭔지 찾아봤습니다.


이 코드는 유니티(관리 메모리)와 C++(비관리 메모리)의 원활한 통신(마샬링,marshal)을 위해 사용되는 코드로 보입니다.


http://www.sysnet.pe.kr/2/0/1558에 자세한 내용이 있습니다.


Sequential Layout은 Managed Memory에서 마샬링을 사용해 Unmanaged Memory로 옮길 때 각 필드의 순서가 Unmanaged Memory에서 유지되는 레이아웃이다. 위의 예제에서 MyStruct구조체는 [StructLayout(LayoutKind.Sequential)]을 사용하고 있는데, 이는 Managed 메모리 영역에서는 순서가 어떨지 모르지만, Unmanaged Memory로 옮겨질 때는 반드시 필드 순서대로 데이타가 옮겨진다는 것을 의미한다.


C#의 데이터가 순서대로 C++에 전달이 되어야 문제없이 사용가능하므로 [StructLayout(LayoutKind.Sequential, Size = 12)]를 사용합니다.

Size = 12부분은 구조체의 크기를 설정하는 부분 같습니다.


https://msdn.microsoft.com/ko-kr/library/system.runtime.interopservices.structlayoutattribute.size(v=vs.110).aspx에 설명이 있습니다.


컴파일러?에 따라 12바이트가 안될 수도 있으므로 struct의 크기를 12바이트로 강제 설정하는 코드가 아닐까 추측합니다.

작성자

Posted by 드리머즈

관련 글

댓글 영역