Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Há várias categorias de estruturas, progressivamente mais complicadas em termos de ações necessárias para marshaling. Eles começam com uma estrutura simples que pode ser copiada em bloco como um todo e continuam para uma estrutura complexa que precisa ser atendida campo a campo.
- estrutura simples
- estrutura simples com ponteiros
- estrutura em conformidade
- estrutura compatível com ponteiros
- estrutura variável compatível (com ou sem ponteiros)
- estrutura dura
- estrutura complexa
- Descrição do layout do membro da estrutura
Nota
Quando comparado com categorias de matriz, fica claro que somente estruturas de até 64k de tamanho podem ser descritas (o tamanho é para a parte plana da estrutura), ou seja, não há equivalente de matrizes SM e LG.
membros comuns às estruturas
alinhamento
O alinhamento necessário do buffer antes de cancelar a gravação da 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 conformantes, esse tamanho não inclui o tamanho da matriz.
offset_to_array_description
Deslocamento do ponteiro de cadeia de caracteres de formato atual para a descrição da matriz de conformidade contida em uma estrutura.
member_layout
Descrição de cada elemento da estrutura. As rotinas de NDR 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 base, matrizes fixas e outras estruturas simples. O principal recurso 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 base, ponteiros, matrizes fixas, estruturas simples e outras estruturas simples com ponteiros. Como o layout<> só precisará ser visitado ao fazer uma conversão de endianidade, ele é colocado no final da descrição.
FC_PSTRUCT alignment<1>
memory_size<2>
pointer_layout<>
member_layout<>
FC_END
Estrutura de conformidade
Uma estrutura conformante contém apenas tipos base, matrizes fixas e estruturas simples e deve conter uma cadeia de caracteres conformante ou uma matriz conformante. Essa matriz pode realmente estar contida em outra estrutura compatível ou estrutura de conformidade com ponteiros inseridos nessa estrutura.
FC_CSTRUCT alignment<1>
memory_size<2>
offset_to_array_description<2>
member_layout<>
FC_END
Estrutura de conformidade com ponteiros
Uma estrutura de conformidade com ponteiros contém apenas tipos de base, ponteiros, matrizes fixas, estruturas simples e estruturas simples com ponteiros; uma estrutura de conformidade deve conter uma matriz de conformidade. Essa matriz pode realmente estar contida em outra estrutura compatível ou estrutura compatível com ponteiros inseridos nessa estrutura.
FC_CPSTRUCT alignment<1>
memory_size<2>
offset_to_array_description<2>
pointer_layout<>
member_layout<> FC_END
Estrutura variável compatível (com ou sem ponteiros)
Uma estrutura variável conformante contém apenas tipos simples, ponteiros, matrizes fixas, estruturas simples e estruturas simples com ponteiros; uma estrutura variável de conformidade deve conter uma cadeia de caracteres conformante ou uma matriz de variação de conformidade. A cadeia de caracteres ou matriz compatível pode realmente ser contida em outra estrutura ou estrutura conformante com ponteiros inseridos nessa estrutura.
FC_CVSTRUCT alignment<1>
memory_size<2>
offset_to_array_description<2>
[pointer_layout<>]
layout<>
FC_END
Estrutura dura
A estrutura dura era um conceito destinado a eliminar penalidades acentuadas 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 de blocos e, portanto, estragam seu desempenho em comparação com uma estrutura simples. Os culpados geralmente são 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. Esses três elementos impedem que a estrutura caia em uma das categorias de estrutura anteriores, que gozam de pequena sobrecarga de interpretação e potencial máximo de otimização, mas não a forçam na categoria de estrutura muito complexa.
O enum16 não deve fazer com que os tamanhos de memória e de fio da estrutura sejam diferentes. A estrutura não pode ter nenhuma matriz de conformidade, nem ponteiros (a menos que 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 pode ser copiado em bloco para/do buffer. Esse total não inclui nenhuma união à direita nem nenhum preenchimento final na memória. Esse valor também é o valor 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 em bloco antes de lidar com qualquer união à direita. Incrementar por esse valor (não por copy_size<2> bytes) gera 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 a verificação adicional deve ser executada durante o marshaling ou desmarsalação (por exemplo, verificações associadas em uma enumeração). Os seguintes tipos de NDR se enquadram nessa categoria:
- tipos simples: ENUM16, __INT3264 (somente em plataformas de 64 bits), um integral com [intervalo]
- preenchimento de alinhamento no final da estrutura
- ponteiros de interface (eles vão usando um complexo inserido)
- ponteiros ignorados (que estão relacionados ao atributo [ignorar] e FC_IGNORE token)
- matrizes complexas, matrizes variadas, matrizes de cadeia de caracteres
- Matrizes de conformidade multidimensional com pelo menos uma dimensão não fixa
- Sindicatos
- elementos definidos com [transmit_as], [represent_as], [wire_marshal], [user_marshal]
- estruturas complexas inseridas
- 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 de conformidade, o campo offset_to_conformant_array_description<2> fornecerá o deslocamento para a descrição da matriz de conformidade, caso contrário, será zero.
Se a estrutura tiver ponteiros, o campo offset_to_pointer_layout<2> fornecerá o deslocamento além 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 de 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.
Nota
Isso contrasta com outras estruturas, que duplicam a descrição de quaisquer ponteiros contidos em matrizes ou estruturas inseridas em seu próprio ponteiro _layout<> campo também.
O formato do layout do ponteiro de uma estrutura complexa também é radicalmente diferente. Como ele contém apenas descrições de membros de ponteiro reais e porque uma estrutura complexa é marshaled e não marcada 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 de início e nenhuma das informações comuns pointer_layout<>.
Descrição do layout do membro da estrutura
A descrição de 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.
Nota
Também há tokens de alinhamento de buffer, FC_ALIGNB2 por meio de FC_ALIGNM8; elas não são usadas.
Preenchimento de memória. Elas 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 conformante na estrutura: FC_STRUCTPADn, em que n é o número de bytes de preenchimento.
Qualquer tipo de não base inserido (observe, no entanto, que uma matriz de conformidade nunca ocorre no layout da estrutura). Isso tem uma descrição de 4 bytes:
FC_EMBEDDED_COMPLEX memory_pad<1> offset_to_description<2>,em que o deslocamento não é garantido como 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 inserido.
Também pode haver um FC_PAD antes do encerramento FC_END, 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.