Condividi tramite


Strutture (RPC)

Esistono diverse categorie di strutture, progressivamente più complesse in termini di azioni necessarie per il marshalling. Iniziano con una struttura semplice che può essere copiata come blocco nel suo complesso e continuano a una struttura complessa che deve essere terminata in base al campo.

Nota

Rispetto alle categorie di matrici, diventa chiaro che è possibile descrivere solo le strutture fino a 64k di dimensioni (la dimensione è per la parte piatta della struttura), che non esiste un equivalente di matrici SM e LG.

 

Membri comuni alle strutture

  • Allineamento

    Allineamento necessario del buffer prima di annullare ilmarshaing della struttura. I valori validi sono 0, 1, 3 e 7 (l'allineamento effettivo meno 1).

  • memory_size

    Dimensione della struttura in memoria in byte; per le strutture conformi, questa dimensione non include le dimensioni della matrice.

  • offset_to_array_description

    Offset dal puntatore di stringa di formato corrente alla descrizione della matrice conforme contenuta in una struttura.

  • member_layout

    Descrizione di ogni elemento della struttura. Le routine NDR devono esaminare questa parte della stringa di formato di un tipo solo se è necessaria la trasformazione endian o se il tipo è una struttura complessa.

  • pointer_layout

    Vedere la sezione Layout puntatore.

Struttura semplice

Una struttura semplice contiene solo tipi di base, matrici fisse e altre strutture semplici. La caratteristica principale della struttura semplice è che può essere copiata come blocco nel suo complesso.

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

Struttura semplice con puntatori

Una struttura semplice con puntatori contiene solo tipi di base, puntatori, matrici fisse, strutture semplici e altre strutture semplici con puntatori. Poiché il layout<> deve essere visitato solo quando si esegue una conversione endianness, viene posizionato alla fine della descrizione.

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

Struttura conforme

Una struttura conforme contiene solo tipi di base, matrici fisse e strutture semplici e deve contenere una stringa conforme o una matrice conforme. Questa matrice potrebbe effettivamente essere contenuta in un'altra struttura conforme o in una struttura conforme con puntatori incorporati in questa struttura.

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

Struttura conforme con puntatori

Una struttura conforme con puntatori contiene solo tipi di base, puntatori, matrici fisse, strutture semplici e strutture semplici con puntatori; una struttura conforme deve contenere una matrice conforme. Questa matrice potrebbe effettivamente essere contenuta in un'altra struttura conforme o in una struttura conforme con puntatori incorporati in questa struttura.

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

Struttura variabile conforme (con o senza puntatori)

Una struttura variabile conforme contiene solo tipi semplici, puntatori, matrici fisse, strutture semplici e strutture semplici con puntatori; una struttura variabile conforme deve contenere una stringa conforme o una matrice conforme variabile. La stringa o la matrice conforme può effettivamente essere contenuta in un'altra struttura conforme o in una struttura conforme con puntatori incorporati in questa struttura.

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

Struttura rigida

La struttura rigida era un concetto volto a eliminare le severe sanzioni legate all'elaborazione di strutture complesse. Deriva da un'osservazione che una struttura complessa ha in genere solo una o due condizioni che impediscono la copia a blocchi e quindi rovinano le prestazioni rispetto a una struttura semplice. I responsabili sono in genere unioni o campi di enumerazione.

Una struttura rigida è una struttura con enum16, riempimento finale in memoria o un'unione come ultimo membro. Questi tre elementi impediscono alla struttura di rientrare in una delle categorie di struttura precedenti, che godono di un sovraccarico di interpretazione ridotto e del potenziale di ottimizzazione massima, ma non la forzano nella categoria di struttura molto costosa.

L'enumerazione16 non deve causare differenze tra la memoria e le dimensioni dei cavi della struttura. La struttura non può avere una matrice conforme, né alcun puntatore (a meno che non faccia parte dell'unione); gli unici membri consentiti sono tipi di base, matrici fisse e strutture semplici.

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

Il campo enum_offset<2> fornisce l'offset dall'inizio della struttura in memoria a un'enumerazione16 se ne contiene uno; in caso contrario, il campo enum_offset<2> è -1.

Il campo copy_size<2> fornisce il numero totale di byte nella struttura, che può essere copiato in blocco dal buffer. Questo totale non include alcuna unione finale né alcun riempimento finale in memoria. Questo valore è anche la quantità che il puntatore del buffer deve essere incrementato dopo la copia.

Il campo mem_copy_incr<2> è il numero di byte che il puntatore alla memoria deve essere incrementato dopo la copia a blocchi prima di gestire qualsiasi unione finale. L'incremento di questa quantità (non di copy_size<2> byte) restituisce un puntatore di memoria appropriato a qualsiasi unione finale.

Struttura complessa

Una struttura complessa è una struttura contenente uno o più campi che impediscono la copia a blocchi della struttura o per cui è necessario eseguire un controllo aggiuntivo durante il marshalling o l'annullamento delmarshaing, ad esempio controlli associati a un'enumerazione. I tipi NDR seguenti rientrano in questa categoria:

  • tipi semplici: ENUM16, __INT3264 (solo su piattaforme a 64 bit), un integrale con [intervallo]
  • riempimento allineamento alla fine della struttura
  • puntatori di interfaccia (usano un complesso incorporato)
  • puntatori ignorati (correlati all'attributo [ignore] e FC_IGNORE token)
  • matrici complesse, matrici variabili, matrici di stringhe
  • Matrici conformi a multidimensionali con almeno una dimensione non con prefisso
  • Sindacati
  • elementi definiti con [transmit_as], [represent_as], [wire_marshal], [user_marshal]
  • strutture complesse incorporate
  • riempimento alla fine della struttura

Una struttura complessa presenta la descrizione del formato seguente:

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

Il campo memory_size<2> è la dimensione della struttura in memoria, espressa in byte.

Se la struttura contiene una matrice conforme, il campo offset_to_conformant_array_description<2> fornisce l'offset alla descrizione della matrice conforme, altrimenti è zero.

Se la struttura include puntatori, il campo offset_to_pointer_layout<2> fornisce l'offset oltre il layout della struttura al layout del puntatore, altrimenti questo campo è zero.

Il campo pointer_layout<> di una struttura complessa viene gestito in modo leggermente diverso rispetto ad altre strutture. Il campo pointer_layout<> di una struttura complessa contiene solo descrizioni di campi puntatore effettivi nella struttura stessa. I puntatori contenuti all'interno di qualsiasi matrice incorporata, unioni o strutture non vengono descritti nel campo pointer_layout<> della struttura complessa.

Nota

Ciò è in contrasto con altre strutture, che duplicano anche la descrizione di qualsiasi puntatore contenuto in matrici o strutture incorporate nel proprio puntatore _layout<> campo.

 

Anche il formato del layout del puntatore di una struttura complessa è radicalmente diverso. Poiché contiene solo descrizioni dei membri del puntatore effettivi e poiché una struttura complessa viene sottoposto a marshalling e non è stato eseguito il marshalling di un campo alla volta, il campo pointer_layout<> contiene semplicemente la descrizione del puntatore di tutti i membri del puntatore. Non esiste alcun inizio FC_PP e nessuna delle normali informazioni pointer_layout<> .

Descrizione layout membro struttura

La descrizione del layout di una struttura contiene uno o più dei caratteri di formato seguenti:

  • Qualsiasi carattere del tipo di base, ad esempio FC_CHAR e così via

  • Direttive di allineamento. Esistono tre caratteri di formato che specificano l'allineamento del puntatore alla memoria: FC_ALIGNM2, FC_ALIGNM4 e FC_ALIGNM8.

    Nota

    Ci sono anche token di allineamento del buffer, FC_ALIGNB2 attraverso FC_ALIGNM8; non vengono utilizzati.

     

  • Spaziatura interna memoria. Questi si verificano solo alla fine della descrizione di una struttura e denotano il numero di byte di riempimento in memoria prima della matrice conforme nella struttura: FC_STRUCTPADn, dove n è il numero di byte di riempimento.

  • Qualsiasi tipo non di base incorporato (si noti, tuttavia, che una matrice conforme non si verifica mai nel layout della struttura). Questa è una descrizione a 4 byte:

    FC_EMBEDDED_COMPLEX memory_pad<1> 
    offset_to_description<2>,
    

    dove l'offset non è garantito che sia allineato a 2 byte.

    <memory_pad 1> è una spaziatura interna necessaria in memoria prima del campo complesso.

    <offset_to_description 2> è un offset di tipo relativo al tipo incorporato.

Potrebbe anche essere presente un FC_PAD prima del FC_END di terminazione, se necessario, per assicurarsi che la stringa di formato venga allineata a un limite di 2 byte dopo il FC_END.