다음을 통해 공유


구조체(RPC)

여러 범주의 구조가 있으며 마샬링에 필요한 작업 측면에서 점진적으로 더 복잡합니다. 전체적으로 블록 복사할 수 있는 간단한 구조로 시작하고 필드별로 서비스해야 하는 복잡한 구조로 계속 진행합니다.

메모

배열 범주와 비교할 때 최대 64k 크기의 구조만 설명할 수 있음(구조체의 평평한 부분에 대한 크기)은 SM 및 LG 배열과 동일하지 않음이 분명해집니다.

 

구조체 공통 멤버

  • 맞춤

    구조체를 구분 해제하기 전에 버퍼의 필요한 맞춤입니다. 유효한 값은 0, 1, 3 및 7입니다(실제 맞춤에서 1을 뺀 값).

  • memory_size

    메모리의 구조 크기(바이트)입니다. 규칙 구조의 경우 이 크기에는 배열의 크기가 포함되지 않습니다.

  • offset_to_array_description

    현재 형식 문자열 포인터에서 구조체에 포함된 규칙 배열의 설명에 대한 오프셋입니다.

  • member_layout

    구조체의 각 요소에 대한 설명입니다. NDR 루틴은 endian 변환이 필요하거나 형식이 복잡한 구조인 경우에만 형식 형식 문자열의 이 부분을 검사해야 합니다.

  • pointer_layout

    포인터 레이아웃 섹션을 참조하세요.

단순 구조체

단순 구조체에는 기본 형식, 고정 배열 및 기타 단순 구조만 포함됩니다. 간단한 구조의 주요 특징은 전체 블록 복사 될 수 있다는 것입니다.

FC_STRUCT alignment<1> 
memory_size<2> 
member_layout<> 
FC_END

포인터가 있는 단순 구조체

포인터가 있는 단순 구조에는 기본 형식, 포인터, 고정 배열, 단순 구조체 및 포인터가 있는 기타 단순 구조만 포함됩니다. 레이아웃<> 엔디안 변환을 수행할 때만 방문해야 하므로 설명의 끝에 배치됩니다.

FC_PSTRUCT alignment<1> 
memory_size<2> 
pointer_layout<> 
member_layout<> 
FC_END

규칙 구조체

규칙 구조는 기본 형식, 고정 배열 및 단순 구조만 포함하며, 규칙 문자열 또는 규칙 배열을 포함해야 합니다. 이 배열은 실제로 이 구조에 포함된 포인터를 사용하여 다른 규칙 구조 또는 규칙 구조에 포함될 수 있습니다.

FC_CSTRUCT alignment<1> 
memory_size<2> 
offset_to_array_description<2> 
member_layout<> 
FC_END

포인터를 사용하는 규칙 구조체

포인터가 있는 규칙 구조에는 기본 형식, 포인터, 고정 배열, 단순 구조체 및 포인터가 있는 단순 구조만 포함됩니다. 규칙적 구조에는 규칙적인 배열이 포함되어야 합니다. 이 배열은 실제로 이 구조에 포함된 포인터를 사용하여 다른 규칙 구조 또는 규칙 구조에 포함될 수 있습니다.

FC_CPSTRUCT alignment<1> 
memory_size<2> 
offset_to_array_description<2> 
pointer_layout<> 
member_layout<> FC_END

준수 다양한 구조체(포인터 포함 또는 제외)

규칙적인 다양한 구조체에는 단순 형식, 포인터, 고정 배열, 단순 구조체 및 포인터가 있는 단순 구조만 포함됩니다. 규칙적인 다양한 구조체에는 규칙적인 문자열 또는 규칙적인 다양한 배열이 포함되어야 합니다. 규칙적인 문자열 또는 배열은 실제로 이 구조에 포함된 포인터를 사용하여 다른 규칙 구조 또는 규칙 구조에 포함될 수 있습니다.

FC_CVSTRUCT alignment<1> 
memory_size<2> 
offset_to_array_description<2> 
[pointer_layout<>] 
layout<> 
FC_END

하드 구조

하드 구조는 복잡한 구조 처리와 관련된 가파른 처벌을 제거하기위한 개념이었습니다. 복잡한 구조체에는 일반적으로 블록 복사를 방지하는 하나 또는 두 개의 조건만 있으므로 단순한 구조에 비해 성능이 저하된다는 관찰에서 파생됩니다. 범인은 일반적으로 공용 구조체 또는 열거형 필드입니다.

하드 구조체는 enum16, 메모리의 끝 안쪽 여백 또는 마지막 멤버로 공용 구조체가 있는 구조체입니다. 이러한 세 가지 요소는 구조체가 이전 구조 범주 중 하나로 떨어지지 않도록 방지합니다. 이 범주는 해석 오버헤드가 적고 최적화 가능성이 최대지만 비용이 많이 드는 복잡한 구조 범주로 강제 적용하지는 않습니다.

열거형16은 구조체의 메모리 및 와이어 크기가 달라서는 안 됩니다. 구조체에는 규칙적인 배열이나 포인터를 가질 수 없습니다(공용 구조체의 일부가 아닌 경우). 허용되는 유일한 멤버는 기본 형식, 고정 배열 및 단순 구조입니다.

FC_HARD_STRUCTURE alignment<1> 
memory_size<2> 
reserved<4> 
enum_offset<2> 
copy_size<2> 
mem_copy_incr<2> 
union_description_offset<2>
member_layout<> 
FC_END

enum_offset<2> 필드는 메모리 구조체의 시작 부분에서 enum16으로의 오프셋을 제공합니다. 그렇지 않으면 enum_offset<2> 필드가 –1입니다.

copy_size<2> 필드는 버퍼에서 블록 복사될 수 있는 구조의 총 바이트 수를 제공합니다. 이 합계에는 후행 공용 구조체 또는 메모리의 끝 패딩이 포함되지 않습니다. 또한 이 값은 복사본 다음에 버퍼 포인터가 증가해야 하는 양이기도 합니다.

mem_copy_incr<2> 필드는 후행 공용 구조체를 처리하기 전에 블록 복사 다음에 메모리 포인터가 증가해야 하는 바이트 수입니다. 이 양만큼 증가하면(copy_size<2> 바이트가 아님) 후행 공용 구조체에 대한 적절한 메모리 포인터가 생성됩니다.

복합 구조체

복합 구조체는 하나 이상의 필드를 포함하는 구조체로, 구조체가 블록 복사되지 않도록 하거나 마샬링 또는 경계 해제 중에 추가 검사를 수행해야 합니다(예: 열거형에 대한 바인딩된 검사). 다음 NDR 형식은 이 범주에 속합니다.

복합 구조에는 다음과 같은 형식 설명이 있습니다.

FC_BOGUS_STRUCT alignment<1> 
memory_size<2> 
offset_to_conformant_array_description<2> 
offset_to_pointer_layout<2> 
member_layout<> 
FC_END 
[pointer_layout<>]

memory_size<2> 필드는 메모리 구조체의 크기(바이트)입니다.

구조에 규칙 배열이 포함된 경우 offset_to_conformant_array_description<2> 필드는 규칙 배열의 설명에 대한 오프셋을 제공하며, 그렇지 않으면 0입니다.

구조체에 포인터가 있는 경우 offset_to_pointer_layout<2> 필드는 구조체의 레이아웃을 지나 포인터 레이아웃에 오프셋을 제공하며, 그렇지 않으면 이 필드는 0입니다.

복합 구조체의 pointer_layout<> 필드는 다른 구조체와 약간 다르게 처리됩니다. 복합 구조체의 pointer_layout<> 필드에는 구조체 자체의 실제 포인터 필드에 대한 설명만 포함됩니다. 포함된 배열, 공용 구조체 또는 구조체 내에 포함된 포인터는 복합 구조체의 pointer_layout<> 필드에 설명되어 있지 않습니다.

메모

이는 포함된 배열에 포함된 포인터 또는 자체 포인터 _layout<> 필드의 구조체에 포함된 포인터의 설명을 복제하는 다른 구조와는 대조적입니다.

 

복잡한 구조체의 포인터 레이아웃 형식도 근본적으로 다릅니다. 실제 포인터 멤버에 대한 설명만 포함하고 복잡한 구조체가 한 번에 하나의 필드를 마샬링하고 숨기지 않으므로 pointer_layout<> 필드에는 모든 포인터 멤버에 대한 포인터 설명만 포함됩니다. 시작 FC_PP 없으며 일반적인 pointer_layout<> 정보가 없습니다.

구조체 멤버 레이아웃 설명

구조체의 레이아웃 설명에는 다음 형식 문자 중 하나 이상이 포함됩니다.

  • 기본 형식 문자(예: FC_CHAR 등)

  • 맞춤 지시문입니다. 메모리 포인터의 맞춤을 지정하는 세 가지 형식 문자가 있습니다. FC_ALIGNM2, FC_ALIGNM4 및 FC_ALIGNM8.

    메모

    FC_ALIGNM8 통해 FC_ALIGNB2 버퍼 맞춤 토큰도 있습니다. 이러한 항목은 사용되지 않습니다.

     

  • 메모리 패딩. 이는 구조체 설명의 끝에서만 발생하며 구조체의 규칙 배열 앞에 있는 메모리의 패딩 바이트 수를 나타냅니다. FC_STRUCTPADn 여기서 n은 패딩의 바이트 수입니다.

  • 포함된 비베이스 형식(그러나 구조체 레이아웃에서는 규칙 배열이 발생하지 않습니다). 여기에는 4 바이트 설명이 있습니다.

    FC_EMBEDDED_COMPLEX memory_pad<1> 
    offset_to_description<2>,
    

    오프셋이 2 바이트 정렬되지 않습니다.

    memory_pad<1> 복소수 필드 앞에 메모리에 필요한 패딩입니다.

    offset_to_description<2> 포함된 형식에 대한 상대 형식 오프셋입니다.

형식 문자열이 FC_END 뒤의 2 바이트 경계에서 정렬되도록 하려면 필요한 경우 종료 FC_END 전에 FC_PAD 있을 수 있습니다.