Структуры (RPC)
Существует несколько категорий структур, постепенно сложнее с точки зрения действий, необходимых для маршалинга. Они начинаются с простой структуры, которая может быть блочного копирования в целом, и продолжить сложную структуру, которая должна обслуживаться по полю.
- простая структура
- простая структура с указателями
- структура соответствия
- соответствующая структура с указателями
- разными структурами (с указателями или без нее)
- жесткая структура
- сложная структура
- описания макета элементов структуры
Заметка
По сравнению с категориями массивов становится ясно, что можно описать только структуры размером до 64 кб (размер находится для плоской части структуры), то есть массивы SM и LG не эквивалентны.
члены, общие для структур
выравнивания
Необходимое выравнивание буфера перед отменой структуры. Допустимые значения: 0, 1, 3 и 7 (фактическое выравнивание минус 1).
memory_size
Размер структуры в памяти в байтах; для соответствующих структур этот размер не включает размер массива.
offset_to_array_description
Смещение от текущего указателя строки формата к описанию соответствующего массива, содержащегося в структуре.
member_layout
Описание каждого элемента структуры. Подпрограммы NDR должны проверять только эту часть строки формата типа, если требуется преобразование endian или если тип является сложной структурой.
pointer_layout
См. раздел макета указателя.
Простая структура
Простая структура содержит только базовые типы, фиксированные массивы и другие простые структуры. Основная особенность простой структуры заключается в том, что она может быть блочного копирования в целом.
FC_STRUCT alignment<1>
memory_size<2>
member_layout<>
FC_END
Простая структура с указателями
Простая структура с указателями содержит только базовые типы, указатели, фиксированные массивы, простые структуры и другие простые структуры с указателями. Так как макет<> придется посещать только при преобразовании эндианности, он помещается в конец описания.
FC_PSTRUCT alignment<1>
memory_size<2>
pointer_layout<>
member_layout<>
FC_END
Структура соответствия
Соответствующая структура содержит только базовые типы, фиксированные массивы и простые структуры, а также должна содержать соответствующую строку или соответствующий массив. Этот массив может содержаться в другой соответствующей структуре или соответствующей структуре с указателями, внедренными в эту структуру.
FC_CSTRUCT alignment<1>
memory_size<2>
offset_to_array_description<2>
member_layout<>
FC_END
Соответствующая структура с указателями
Соответствующая структура с указателями содержит только базовые типы, указатели, фиксированные массивы, простые структуры и простые структуры с указателями; Соответствующая структура должна содержать соответствующий массив. Этот массив может содержаться в другой соответствующей структуре или соответствующей структуре с указателями, внедренными в эту структуру.
FC_CPSTRUCT alignment<1>
memory_size<2>
offset_to_array_description<2>
pointer_layout<>
member_layout<> FC_END
Соответствующая разнообразная структура (с указателями или без нее)
Соответствующая разнообразная структура содержит только простые типы, указатели, фиксированные массивы, простые структуры и простые структуры с указателями; Соответствующая структура должна содержать соответствующую строку или соответствующий массив. Соответствующая строка или массив фактически может содержаться в другой соответствующей структуре или соответствующей структуре с указателями, внедренными в эту структуру.
FC_CVSTRUCT alignment<1>
memory_size<2>
offset_to_array_description<2>
[pointer_layout<>]
layout<>
FC_END
Жесткая структура
Жесткая структура — это концепция, направленная на устранение крутых штрафов, связанных с обработкой сложных структур. Он является производным от наблюдения, что сложная структура обычно имеет только одно или два условия, которые препятствуют блочного копирования, и поэтому портят его производительность по сравнению с простой структурой. Виновниками обычно являются профсоюзы или поля перечисления.
Жесткая структура — это структура, которая содержит перечисление16, конечную заполнение в памяти или объединение в качестве последнего элемента. Эти три элемента препятствуют переходу структуры в одну из предыдущих категорий структур, которые пользуются небольшими затратами на интерпретацию и максимальным потенциалом оптимизации, но не заставлять его в очень затратную категорию структуры.
Перечисление16 не должно привести к различиям размеров памяти и провода структуры. Структура не может иметь ни соответствующий массив, ни какие-либо указатели (если только часть объединения); единственными допустимыми являются базовые типы, фиксированные массивы и простые структуры.
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
Поле enum_offset<2> обеспечивает смещение от начала структуры в памяти до перечисления16, если оно содержит одно; В противном случае поле enum_offset<2> равно –1.
Поле copy_size<2> предоставляет общее количество байтов в структуре, которое может быть блочное копирование в буфер или из нее. Этот общий объем не включает в себя ни одно конечное объединение, ни конечную заполнение в памяти. Это значение также является объемом указателя буфера, который следует увеличить после копирования.
Поле mem_copy_incr<2> — это число байтов, которые указатель памяти следует увеличить после блокировки копирования перед обработкой любого конечного объединения. Приращение к этому объему (не по copy_size<2> байтам) дает правильный указатель памяти на любой конечный союз.
Сложная структура
Сложная структура — это любая структура, содержащая одно или несколько полей, которые либо предотвращают копирование структуры, либо для которой необходимо выполнить дополнительную проверку во время маршалинга или отмены маршалинга (например, привязанные проверки перечисления). Следующие типы NDR попадают в эту категорию:
- простых типов: ENUM16, __INT3264 (только на 64-разрядных платформах), целочисленный с [диапазон]
- Выравнивание заполнения в конце структуры
- указатели интерфейса (они используют внедренный комплекс)
- игнорируемые указатели (связанные с [игнорировать атрибуты] и маркер FC_IGNORE)
- сложные массивы, различные массивы, строковые массивы
- многомерные массивы соответствия с по крайней мере одним нефиксным измерением
- Союзов
- элементы, определенные с [transmit_as], [represent_as], [wire_marshal], [user_marshal]
- внедренные сложные структуры
- заполнение в конце структуры
Сложная структура содержит следующее описание формата:
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<>]
Поле memory_size<2> — это размер структуры в памяти в байтах.
Если структура содержит соответствующий массив, поле offset_to_conformant_array_description<2> предоставляет смещение к описанию соответствующего массива, в противном случае оно равно нулю.
Если структура содержит указатели, поле offset_to_pointer_layout<2> предоставляет смещение в макете структуры до макета указателя, в противном случае это поле равно нулю.
Поле pointer_layout<> сложной структуры обрабатывается несколько иначе, чем для других структур. Поле pointer_layout<> сложной структуры содержит только описания фактических полей указателя в самой структуре. Все указатели, содержащиеся в любых внедренных массивах, объединениях или структурах, не описываются в поле pointer_layout<> сложной структуры.
Заметка
Это отличается от других структур, которые дублируют описание любых указателей, содержащихся в внедренных массивах или структурах в собственном поле _layout<> указателя.
Формат макета указателя сложной структуры также существенно отличается. Так как он содержит только описания фактических элементов указателя, так как сложная структура маршалируется и немаршалируется одно поле за раз, поле pointer_layout<> просто содержит описание указателя всех элементов указателя. Нет начальных FC_PP, и ни одна из обычных pointer_layout<> информации.
Описание макета элемента структуры
Описание макета структуры содержит один или несколько следующих символов формата:
Любой из символов базового типа, например FC_CHAR, и т. д.
Директивы выравнивания. Существует три символа формата, указывающие выравнивание указателя памяти: FC_ALIGNM2, FC_ALIGNM4 и FC_ALIGNM8.
Заметка
Существуют также маркеры выравнивания буфера, FC_ALIGNB2 через FC_ALIGNM8; они не используются.
Заполнение памяти. Они происходят только в конце описания структуры и указывают количество байтов заполнения в памяти до соответствующего массива в структуре: FC_STRUCTPADn, где n — количество байтов заполнения.
Любой внедренный тип небазы (обратите внимание, что соответствующий массив никогда не встречается в макете структуры). Это описание 4-байтов:
FC_EMBEDDED_COMPLEX memory_pad<1> offset_to_description<2>,
если смещение не гарантируется выравниванием по 2 байтам.
memory_pad<1> — это заполнение, необходимое в памяти перед сложным полем.
offset_to_description<2> — это смещение относительного типа для внедренного типа.
Кроме того, может быть FC_PAD перед завершением FC_END при необходимости, чтобы убедиться, что строка формата будет выровнена по 2-байтовой границе после FC_END.