構造 (RPC)
構造にはいくつかのカテゴリがあり、マーシャリングに必要なアクションの観点から徐々に複雑になります。 これらは、全体としてブロックコピーできるシンプル構造から始まり、フィールドごとに処理する必要がある複合構造に進みます。
Note
配列のカテゴリと比較すると、最大 64k のサイズの構造しか記述できないことがわかります (サイズは構造のフラット部分用です)。したがって、SM 配列と LG 配列に相当するものはありません。
構造に共通するメンバー
位置合わせ
構造のマーシャリングを解除する前のバッファーの必要なアラインメント。 有効な値は 0、1、3、7 です (実際の配置から 1 を引いた値)。
memory_size
メモリ内の構造のサイズ (バイト単位)。準拠構造の場合、このサイズには配列のサイズは含まれません。
offset_to_array_description
現在の書式指定文字列ポインターから、構造に含まれる適合配列の説明へのオフセット。
member_layout
構造の各要素の説明。 NDR ルーチンは、エンディアン変換が必要な場合、または型が複合構造である場合にのみ、型の書式指定文字列のこの部分を調べる必要があります。
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
ハード構造
ハード構造は、複合構造の処理に関連する急なペナルティを排除することを目的とした概念でした。 通常、複合構造にはブロック コピーを妨げる条件が 1 つまたは 2 つしかないため、シンプル構造と比較してパフォーマンスが損なわれるという観察から派生しています。 通常、原因は共用体または列挙フィールドです。
ハード構造は、enum16、メモリ内のエンド パディング、または最後のメンバーとして共用体を持つ構造です。 これら 3 つの要素は、構造が以前の構造カテゴリのいずれかに分類されるのを防ぎます。これは、解釈オーバーヘッドが小さく、最適化の可能性が最大ですが、非常にコストのかかる複合構造カテゴリには強制されません。
enum16 では、構造のメモリとワイヤ のサイズが異なってはなりません。 構造には、一致する配列やポインター (共用体の一部を除く) を含めることはできません。他に許可されるメンバーは、基本型、固定配列、およびシンプル構造のみです。
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> フィールドは、メモリ内の構造の先頭から enum16 までのオフセットを提供します (含まれている場合)。 それ以外の場合、enum_offset<2> フィールドは –1 です。
copy_size<2> フィールドは構造内の合計バイト数を提供します。このバイト数は、バッファー内またはバッファーからブロックコピーされる可能性があります。 この合計には、末尾の共用体やメモリ内の末尾のパディングは含まれません。 この値は、コピー後にバッファー ポインターをインクリメントする必要がある量でもあります。
mem_copy_incr<2> フィールドは、末尾の共用体を処理する前に、ブロック コピーの後にメモリ ポインターをインクリメントする必要があるバイト数です。 (<2> バイトcopy_sizeではなく) この量だけインクリメントすると、後続の共用体への適切なメモリ ポインターが生成されます。
複合構造
複合構造とは、構造がブロック コピーされないようにする 1 つ以上のフィールドを含む構造、またはマーシャリング中またはマーシャリング解除中に追加のチェックを実行する必要がある構造です (列挙型のバインドされたチェックなど)。 次の NDR の種類は、このカテゴリに該当します。
- シンプル型: ENUM16、__INT3264 (64 ビット プラットフォームの場合のみ)、整数と [範囲]
- 構造の末尾の配置パディング
- インターフェイス ポインター (埋め込み複合関数を使用)
- 無視されたポインター ([ignore] 属性とFC_IGNORE トークンに関連)
- 複合配列、可変配列、文字列配列
- 少なくとも 1 つの非固定ディメンションを持つ多次元適合配列
- 共用体
- [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> フィールドは、整合配列の説明へのオフセットを提供します。それ以外の場合は 0 です。
構造にポインターがある場合、offset_to_pointer_layout<2> フィールドは構造のレイアウトを超えるオフセットをポインター レイアウトに提供します。それ以外の場合、このフィールドは 0 です。
複合構造のpointer_layout<> フィールドは、他の構造の場合とは若干異なる方法で処理されます。 複合構造の pointer_layout<> フィールドには、構造自体の実際のポインター フィールドの説明のみが含まれます。 埋め込まれた配列、共用体、または構造に含まれるポインターは、複合構造の pointer_layout<> フィールドには記述されません。
Note
これは他の構造とは対照的で、埋め込まれた配列または構造に含まれるポインターの説明を独自の pointer_layout<> フィールドにも複製します。
複合構造のポインター レイアウトの形式も大きく異なります。 実際のポインター メンバーの説明のみが含まれており、複合構造が一度に 1 つのフィールドをマーシャリングしてマーシャリングしないため、pointer_layout<> フィールドには、すべてのポインター メンバーのポインターの説明が含まれます。 最初の FC_PP はなく、通常の pointer_layout<> 情報もありません。
構造メンバー レイアウトの説明
構造のレイアウト記述には、次の 1 つ以上の書式文字が含まれています。
基本型文字 (FC_CHAR など)
調整ディレクティブ。 メモリ ポインターの配置を指定する形式文字には、FC_ALIGNM2、FC_ALIGNM4、FC_ALIGNM8 の 3 つがあります。
Note
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_END の後の 2 バイト境界に配置されるようにするために、必要に応じて、終了 FC_END の前に FC_PAD が存在する場合もあります。