Partilhar via


Estruturas (RPC)

Existem várias categorias de estruturas, progressivamente mais complicadas em termos de ações necessárias para o marshaling. Eles começam com uma estrutura simples que pode ser copiada em bloco como um todo, e continuam com uma estrutura complexa que precisa ser atendida campo por campo.

Observação

Quando comparado com categorias de matrizes, torna-se claro que apenas estruturas de até 64k de tamanho podem ser descritas (o tamanho é para a parte plana da estrutura), ou seja, não há equivalente a matrizes SM e LG.

 

Membros comuns às estruturas

  • alinhamento

    O alinhamento necessário do buffer antes de desempacotar a estrutura. Os valores válidos são 0, 1, 3 e 7 (o alinhamento real menos 1).

  • memory_size

    Tamanho da estrutura na memória em bytes; Para estruturas conformes, esse tamanho não inclui o tamanho da matriz.

  • offset_to_array_description

    Deslocamento do ponteiro de cadeia de caracteres do formato atual para a descrição da matriz conforme contida em uma estrutura.

  • member_layout

    Descrição de cada elemento da estrutura. As rotinas de notificação de falha na entrega só precisam examinar essa parte da cadeia de caracteres de formato de um tipo se a transformação endian for necessária ou se o tipo for uma estrutura complexa.

  • pointer_layout

    Consulte a seção Layout do Ponteiro.

Estrutura simples

Uma estrutura simples contém apenas tipos de base, matrizes fixas e outras estruturas simples. A principal característica da estrutura simples é que ela pode ser copiada em bloco como um todo.

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

Estrutura simples com ponteiros

Uma estrutura simples com ponteiros contém apenas tipos de base, ponteiros, matrizes fixas, estruturas simples e outras estruturas simples com ponteiros. Como o layout<> só terá que ser visitado ao fazer uma conversão de endianness, ele é colocado no final da descrição.

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

Estrutura Conformante

Uma estrutura conforme contém apenas tipos de base, matrizes fixas e estruturas simples, e deve conter uma cadeia de caracteres conforme ou uma matriz conformante. Esta matriz pode realmente estar contida em outra estrutura conformante ou estrutura conformante com ponteiros que está embutida nesta estrutura.

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

Estrutura conforme com ponteiros

Uma estrutura conforme com ponteiros contém apenas tipos de base, ponteiros, matrizes fixas, estruturas simples e estruturas simples com ponteiros; Uma estrutura conforme deve conter uma matriz conformante. Esta matriz pode realmente estar contida em outra estrutura conformante ou estrutura conformante com ponteiros que está embutido nesta estrutura.

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

Estrutura variável conforme (com ou sem ponteiros)

Uma estrutura variável conforme contém apenas tipos simples, ponteiros, matrizes fixas, estruturas simples e estruturas simples com ponteiros; Uma estrutura variável conforme deve conter uma cadeia de caracteres conforme ou uma matriz variável em conformidade. A cadeia de caracteres ou matriz conforme pode realmente estar contida em outra estrutura conformante ou estrutura conforme com ponteiros que está incorporado nesta estrutura.

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

Estrutura Rígida

A estrutura rígida era um conceito destinado a eliminar penalidades pesadas relacionadas ao processamento de estruturas complexas. É derivado de uma observação de que uma estrutura complexa normalmente tem apenas uma ou duas condições que impedem a cópia em bloco e, portanto, estragam seu desempenho em comparação com uma estrutura simples. Os culpados são geralmente uniões ou campos de enumeração.

Uma estrutura dura é uma estrutura que tem um enum16, preenchimento final na memória, ou uma união como o último membro. Estes três elementos impedem que a estrutura caia em uma das categorias de estrutura anteriores, que desfrutam de pequena sobrecarga de interpretação e potencial máximo de otimização, mas não a forçam para a categoria de estrutura complexa muito cara.

O enum16 não deve fazer com que os tamanhos de memória e fio da estrutura difiram. A estrutura não pode ter nenhuma matriz conformante, nem ponteiros (a menos que faça parte da união); Os únicos outros membros permitidos são tipos base, matrizes fixas e estruturas simples.

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

O campo enum_offset<2> fornece o deslocamento do início da estrutura na memória para um enum16 se ele contiver um; caso contrário, o campo> enum_offset<2 é –1.

O campo copy_size<2> fornece o número total de bytes na estrutura, que podem ser copiados em bloco para/do buffer. Este total não inclui qualquer união à direita nem qualquer preenchimento final na memória. Esse valor também é a quantidade que o ponteiro do buffer deve ser incrementado após a cópia.

O campo mem_copy_incr<2> é o número de bytes que o ponteiro de memória deve ser incrementado após a cópia de bloco antes de lidar com qualquer união à direita. O incremento por essa quantidade (não por copy_size<2> bytes) produz um ponteiro de memória adequado para qualquer união à direita.

Estrutura complexa

Uma estrutura complexa é qualquer estrutura que contenha um ou mais campos que impeçam que a estrutura seja copiada em bloco, ou para a qual uma verificação adicional deve ser executada durante o marshaling ou unmarshaling (por exemplo, verificações encadernadas em uma enumeração). Os seguintes tipos de notificação de falha na entrega se enquadram nessa categoria:

  • tipos simples: ENUM16, __INT3264 (apenas em plataformas de 64 bits), uma integral com [intervalo]
  • preenchimento de alinhamento no final da estrutura
  • ponteiros de interface (eles usam um complexo incorporado)
  • ponteiros ignorados (relacionados ao atributo [ignore] e ao token FC_IGNORE)
  • matrizes complexas, matrizes variáveis, matrizes de cadeia de caracteres
  • matrizes conformes multidimensionais com pelo menos uma dimensão não fixa
  • sindicatos
  • elementos definidos com [transmit_as], [represent_as], [wire_marshal], [user_marshal]
  • estruturas complexas embutidas
  • preenchimento no final da estrutura

Uma estrutura complexa tem a seguinte descrição de formato:

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<>]

O campo memory_size<2> é o tamanho da estrutura na memória, em bytes.

Se a estrutura contiver uma matriz conforme, o campo offset_to_conformant_array_description<2> fornece o deslocamento para a descrição da matriz conforme, caso contrário, é zero.

Se a estrutura tiver ponteiros, o campo offset_to_pointer_layout<2> fornece o deslocamento do layout da estrutura para o layout do ponteiro, caso contrário, esse campo será zero.

O campo pointer_layout<> de uma estrutura complexa é tratado de forma um pouco diferente do que para outras estruturas. O campo pointer_layout<> de uma estrutura complexa contém apenas descrições de campos de ponteiro reais na própria estrutura. Quaisquer ponteiros contidos em matrizes, uniões ou estruturas incorporadas não são descritos no campo pointer_layout<> da estrutura complexa.

Observação

Isso contrasta com outras estruturas, que duplicam a descrição de quaisquer ponteiros contidos em matrizes ou estruturas incorporadas em seu próprio campo de _layout<> de ponteiro também.

 

O formato do layout de ponteiro de uma estrutura complexa também é radicalmente diferente. Como ele contém apenas descrições de membros reais do ponteiro e porque uma estrutura complexa é empacotada e desempacotada um campo de cada vez, o campo pointer_layout<> simplesmente contém a descrição do ponteiro de todos os membros do ponteiro. Não há FC_PP inicial e nenhuma das informações pointer_layout<> usuais.

Descrição do layout do membro da estrutura

A descrição do layout de uma estrutura contém um ou mais dos seguintes caracteres de formato:

  • Qualquer um dos caracteres de tipo base, como FC_CHAR, e assim por diante

  • Diretivas de alinhamento. Há três caracteres de formato especificando o alinhamento do ponteiro de memória: FC_ALIGNM2, FC_ALIGNM4 e FC_ALIGNM8.

    Observação

    Há também tokens de alinhamento de buffer, FC_ALIGNB2 a FC_ALIGNM8; estes não são utilizados.

     

  • Preenchimento de memória. Estes ocorrem apenas no final da descrição de uma estrutura e denotam o número de bytes de preenchimento na memória antes da matriz conforme na estrutura: FC_STRUCTPADn, onde n é o número de bytes de preenchimento.

  • Qualquer tipo não base incorporado (observe, no entanto, que uma matriz conforme nunca ocorre no layout da estrutura). Isto tem uma descrição de 4 bytes:

    FC_EMBEDDED_COMPLEX memory_pad<1> 
    offset_to_description<2>,
    

    onde não é garantido que o deslocamento esteja alinhado a 2 bytes.

    memory_pad<1> é um preenchimento necessário na memória antes do campo complexo.

    offset_to_description<2> é um deslocamento de tipo relativo para o tipo incorporado.

Também pode haver um FC_PAD antes do FC_END de encerramento, se necessário, para garantir que a cadeia de caracteres de formato será alinhada em um limite de 2 bytes após o FC_END.