문제

C 층에 핀발을하는 32 비트 .NET 어셈블리가 있습니다. 이 어셈블리를 64 비트로 포트하고 싶습니다. 나는 64 비트로 포팅하는 것과 관련된 많은 문서를 읽었으며, 이들은 구조를 사용하려면 정렬을 처리해야한다고 제안하는 것 같습니다.

나는 구조 정렬과 관련된 일반적인 질문이 있었고 먼저 아무것도 놓치지 않도록 명확히하고 싶었습니다.

구조물 포인터를 받아들이고 기본적으로 내부 값을 채우는 C 진입 점이 있다고 가정합니다. 이 C 코드에는 포장 지침이 없으며 모든 .NET structs가 pack = 8에 정렬되어 있습니다. 따라서 인접한 ints가있는 구조를 전달하면 기본적으로 C가 Pack = 4를 사용하고 구조물을 .NET의 .NET에서 pack = 8으로 해석하고 있기 때문에 .NET 레이어에 채워진 데이터를 해석하는 데 문제가 될 수 있다고 생각했습니다. 레이어, 그래서 문제가 발생할 수 있다고 생각했습니다. 그러나 그것은 사실이 아닌 것 같습니다. 데이터는 정상으로 해석되는 것 같습니다.

누구 든지이 행동을 설명 할 수 있습니까?

고마워요, 니란자

도움이 되었습니까?

해결책

나는이 MSDN 기사를 발견했다http://msdn.microsoft.com/en-us/library/aa366769(vs.85).aspx

유형의 자연스러운 정렬보다 큰 포장 수준을 지정한다고해서 유형 정렬이 변경되지는 않습니다. 따라서 내가 언급 한 위의 경우 자연적인 정렬은 4이므로 포장을 8로 설정한다고해서 실제로 구조의 정렬이 변경되지는 않습니다. 이것은 행동을 설명합니다.

다른 팁

기본적으로 구조 또는 노조의 구성원은 자연 경계에 정렬됩니다. 숯의 1 바이트, 정수 등의 짧은 바이트, 4 바이트 등의 바이트 등이있는 경우 N이있는 경우 2의 힘이어야합니다.

예를 들어, #Pragma Pack (2)는 자연스러운 정렬 경계 대신 2 바이트 경계에서 int, Long, Long, Float, Double, Long Double 및 Pointers를 정렬합니다. N이 플랫폼에서 가장 엄격한 정렬과 동일하거나 크면 (X86의 4 개, SPARC V8의 8 개, SPARC V9의 16) 인 경우 지침은 자연적인 정렬의 영향을 미칩니다.

X86 아키텍처가 64 비트 환경을 지원하더라도 8 바이트 정렬을 지원하는지 확실하지 않습니다. 결국, 64 비트 플랫폼의 4 바이트 정렬은 아무것도 해치지 않을 것입니다.

#pragma align 8 (변수)도 사용할 수 있습니다. 컴파일러에게 글로벌 또는 정적 변수 정렬을 원하는 방법을 알려줍니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top