結構 (RPC)

在封送處理所需的動作方面,有數種結構類別,逐漸變得更加複雜。 其開頭是一個簡單的結構,可以整體進行區塊複製,並繼續依字段服務的複雜結構。

注意

與陣列類別相比,很明顯,只有大小高達64k的結構可以描述 (大小是結構的平面部分),沒有相當於SM和LG數位。

 

結構通用的成員

  • 對準

    取消分割結構之前,緩衝區的必要對齊方式。 有效值為 0、1、3 和 7(實際對齊減 1)。

  • memory_size

    以位元組為單位的記憶體結構大小;對於符合性結構,這個大小不包含數位的大小。

  • offset_to_array_description

    從目前格式字串指標位移至 結構中包含的一致性陣列描述。

  • member_layout

    結構中每個元素的描述。 如果需要 endian 轉換,或類型是複雜的結構,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

硬式結構

硬結構是一個旨在消除與處理複雜結構相關的尖刻懲罰的概念。 它衍生自觀察,複雜結構通常只有一或兩個條件,以防止區塊複製,因此會破壞其效能,相較於簡單結構。 罪犯通常是等位或列舉欄位。

硬式結構是具有列舉16、記憶體結尾填補或等位為最後一個成員的結構。 這三個元素可防止結構落入先前的其中一個結構類別,其具有較小的解譯額外負荷和最大的優化潛力,但不強制進入成本高昂的複雜結構類別。

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> 位元段是記憶體指標在處理任何尾端聯集之前,應該在區塊複製之後遞增的位元組數目。 遞增此數量(不是以 copy_size<2> 個字節為單位)會產生任何尾端聯集的適當記憶體指標。

複雜結構

複雜結構是包含一或多個字段的結構,這些欄位會防止結構遭到封鎖複製,或在封送處理或取消分送處理期間必須執行其他檢查(例如,列舉的系結檢查)。 下列 NDR 型態屬於此類別:

  • 簡單類型:ENUM16、__INT3264(僅限 64 位平臺上),具有 [range] 的整數
  • 結構結尾的對齊填補
  • 介面指標(它們會使用內嵌複雜體)
  • 忽略的指標 (與 [ignore] 屬性和FC_IGNORE標記相關)
  • 複雜陣列、不同的陣列、字串數位
  • 具有至少一個非fixed 維度的多維度一致性陣列
  • 工會
  • 以 [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_END之前,也可能有FC_PAD,以確保格式字元串在FC_END之後的 2 位元組界限對齊。