Matrizes (RPC)

Várias categorias de matriz foram definidas com base em suas características de desempenho, principalmente se a matriz pode ser copiada em bloco.

Para algumas categorias, como uma matriz de tamanho fixo, existem dois tipos de descritores de matriz; eles são indicados por uma correção no nome do token FC principal.

Caractere de formato Descrição
SM O tamanho total do tipo pode ser representado em um int sem sinal de 16 bits.
LG O tamanho total do tipo precisa de um longo sem sinal de 32 bits para ser representado.

 

Campos comuns a matrizes:

  • total_size

    Tamanho total da matriz na memória, em bytes. Isso é o mesmo que o tamanho do fio após o alinhamento. O tamanho total é calculado para categorias para as quais o problema de preenchimento não existe e o tamanho é o tamanho real da matriz.

  • element_size

    Tamanho total na memória de um único elemento da matriz, incluindo o preenchimento (isso pode acontecer somente para matrizes complexas).

  • element_description

    Descrição do tipo de elemento de matriz.

  • pointer_layout

    Consulte o tópico Layout do Ponteiro para obter mais informações.

Matrizes de tamanho fixo

Uma cadeia de caracteres de formato de matriz de tamanho fixo é gerada para matrizes que têm um tamanho conhecido e, portanto, pode ser copiada em bloco para o buffer de marshaling. Os dois formatos de descritor de matriz fixa são os seguintes.

FC_SMFARRAY alignment<1> 
total_size<2> 
[pointer_layout<>]  
element_description<> 
FC_END

e

FC_LGFARRAY alignment<1> 
total_size<4> 
[pointer_layout<>] 
element_description<> 
FC_END

Matriz de conformidade

Uma matriz compatível pode ser copiada em bloco depois que o tamanho da matriz for conhecido.

FC_CARRAY alignment<1>
element_size<2> 
conformance_description<> 
[pointer_layout<>] 
element_description<> 
FC_END

O conformance_description<> é um descritor de correlação e tem 4 ou 6 bytes, dependendo se /robust é usado.

Matriz variável de conformidade

Uma matriz variável compatível também pode ser copiada em bloco.

FC_CVARRAY alignment<1> 
element_size<2> 
conformance_description<> 
variance_description<>  
[pointer_layout<>] 
element_description<> 
FC_END

O conformance_description<> e variance_description<> é um descritor de correlação e tem 4 ou 6 bytes, dependendo se /robust é usado.

Matriz variável

As matrizes variáveis têm duas possibilidades dependendo do tamanho da matriz.

FC_SMVARRAY alignment<1>
total_size<2>  
number_elements<2> 
element_size<2> 
variance_description<> 
[pointer_layout<>] 
element_description<> 
FC_END

FC_LGVARRAY alignment<1>
total_size<4>  
number_elements<4> 
element_size<2> 
variance_description<4>
[pointer_layout<>] 
element_description<> 
FC_END

O variance_description<> é um descritor de correlação e tem 4 ou 6 bytes, dependendo do /robust sendo usado.

Para matrizes variáveis inseridas dentro de uma estrutura, o campo deslocamento<2> do variance_description<> é um deslocamento relativo da posição da matriz variável na estrutura para a variância que descreve o campo. O deslocamento normalmente é relativo ao início da estrutura.

Matrizes Complexas

Uma matriz complexa é qualquer matriz com um elemento que a impede de ser copiada em bloco e, como tal, ações adicionais precisam ser executadas. Esses elementos tornam uma matriz complexa:

  • tipos simples: ENUM16, __INT3264 (somente em plataformas de 64 bits), um integral com [intervalo]
  • ponteiros de referência e interface (todos os ponteiros em plataformas de 64 bits)
  • uniões
  • estruturas complexas (consulte o tópico Descrição da Estrutura Complexa para obter uma lista completa de motivos para uma estrutura ser complexa)
  • elementos definidos com [transmit_as], [user_marshal]
  • Todas as matrizes multidimensionais com pelo menos uma dimensão compatível e/ou variável são complexas, independentemente do tipo de elemento subjacente.

A descrição da matriz complexa é a seguinte:

FC_BOGUS_ARRAY alignment<1> 
number_of_elements<2> 
conformance_description<> 
variance_description<> 
element_description<> 
FC_END

O campo number_of_elements<2> será zero se a matriz estiver em conformidade.

O conformance_description<> e variance_description<> é um descritor de correlação e tem 4 ou 6 bytes, dependendo se /robust é usado. Se a matriz tiver conformidade e/ou variação, os campos conformance_description<> e/ou variance_description<> têm descrições válidas, caso contrário, os primeiros 4 bytes do descritor de correlação serão definidos como 0xFFFFFFFF. Os sinalizadores, quando presentes, são definidos como zero.