Массивы (RPC)

Было определено несколько категорий массивов на основе их характеристик производительности, в первую очередь на том, можно ли скопировать массив блоком.

Для некоторых категорий, таких как массив фиксированного размера, существуют два типа дескрипторов массива; Они указываются в исправлении в имени ведущего токена FC.

Формат символа Описание
SM Общий размер типа можно представить в 16-разрядном int без знака.
LG Общий размер типа должен представлять 32-разрядную длину без знака.

 

Поля, общие для массивов:

  • total_size

    Общий размер массива в памяти, в байтах. Это то же самое, что и размер провода после выравнивания. Общий размер вычисляется для категорий, для которых проблема с заполнением не существует, а размер равен фактическому размеру массива.

  • element_size

    Общий размер в памяти одного элемента массива, включая заполнение (это может произойти только для сложных массивов).

  • element_description

    Описание типа элемента массива.

  • pointer_layout

    Дополнительные сведения см. в разделе Макет указателя .

Массивы фиксированного размера

Строка формата массива фиксированного размера создается для массивов с известным размером и, следовательно, может быть скопирована блоком в буфер маршалинга. Ниже приведены два формата дескриптора фиксированного массива.

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

и

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

Соответствующий массив

Соответствующий массив можно блочное копирование после того, как будет известен размер массива.

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

Conformance_description<> является дескриптором корреляции и имеет 4 или 6 байт в зависимости от того, используется ли параметр /robust .

Соответствующий изменяющийся массив

Соответствующий изменяющийся массив также можно блочное копирование.

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

Conformance_description<> и variance_description<> являются дескриптором корреляции и имеют 4 или 6 байт в зависимости от того, используется ли параметр /robust .

Изменяющиеся массивы

Различные массивы имеют две возможности в зависимости от размера массива.

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

Variance_description<> является дескриптором корреляции и имеет 4 или 6 байт в зависимости от используемого параметра /robust .

Для различных массивов, внедренных в структуру, поле смещения<2> variance_description<> является относительным смещением от положения массива в структуре до поля описания дисперсии. Смещение обычно относительно начала структуры.

Сложные массивы

Сложный массив — это любой массив с элементом, который предотвращает его блочное копирование, поэтому необходимо предпринять дополнительные действия. Эти элементы делают массив сложным:

  • простые типы: ENUM16, __INT3264 (только на 64-разрядных платформах), целочисленный с [диапазоном]
  • указатели ссылок и интерфейсов (все указатели на 64-разрядных платформах)
  • объединения
  • сложные структуры (полный список причин, по которым структура должна быть сложной, см. в разделе Описание сложной структуры)
  • элементы, определенные с помощью [transmit_as], [user_marshal]
  • Все многомерные массивы по крайней мере с одним соответствующим и/или изменяющимся измерением являются сложными независимо от типа базового элемента.

Описание сложного массива выглядит следующим образом:

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

Поле number_of_elements<2> равно нулю, если массив соответствует требованиям.

Conformance_description<> и variance_description<> являются дескриптором корреляции и имеют 4 или 6 байт в зависимости от того, используется ли параметр /robust . Если массив имеет соответствие и(или) дисперсию, то поля conformance_description<> и(или) variance_description<> имеют допустимые описания, в противном случае первые 4 байта дескриптора корреляции задаются как 0xFFFFFFFF. Флаги, если они присутствуют, устанавливаются в нулевое значение.