Bagikan melalui


Serikat rpc

Serikat yang dienkapsulasi dan tidak terenkapsulasi berbagi format union_arm_selector<> umum:

union_arms<2>
arm1_case_value<4> offset_to_arm_description<2>
..
armN_case_value<4> offset_to_arm_description<2>
default_arm_description<2>

Bidang union_arms<2> terdiri dari dua bagian. Jika penyatuan adalah persatuan gaya MIDL 1.0, 4 bit atas berisi perataan lengan union (perataan lengan selaras terbesar). Jika tidak, 4 bit atas adalah nol. 12 bit yang lebih rendah berisi jumlah lengan dalam serikat. Dengan kata lain:

alignment<highest nibble> arm_counter<three lower nibbles>

Bidang offset_to_arm_description<2> berisi offset yang ditandatangani relatif ke deskripsi jenis lengan. Namun, bidang kelebihan beban dengan pengoptimalan untuk jenis sederhana. Untuk ini, byte atas bidang offset ini FC_MAGIC_UNION_BYTE (0x80) dan byte yang lebih rendah dari pendek adalah jenis karakter format aktual lengan. Dengan demikian, ada dua rentang untuk nilai offset: "80 xx" berarti bahwa xx adalah string format jenis; dan segala sesuatu yang lain dalam rentang (80 FF .. 7f FF) berarti offset aktual. Ini membuat offset dari rentang <80 00 .. 80 FF > tidak tersedia sebagai offset. Kompilator memeriksa bahwa per MIDL versi 5.1.164.

Bidang default_arm_description<2> menunjukkan jenis lengan serikat untuk lengan default, jika ada. Jika tidak ada arm default yang ditentukan untuk union, maka bidang default_arm_description<2> 0xFFFF dan pengecualian dimunculkan jika nilai switch_is tidak cocok dengan salah satu nilai kasus arm. Jika lengan default ditentukan tetapi kosong, maka bidang> default_arm_description<2 adalah nol. Jika tidak, bidang> default_arm_description<2 memiliki semantik yang sama dengan bidang> offset_to_arm_description<2.

Berikut ini adalah ringkasan:

  • 0 - default kosong
  • FFFF - tidak ada default
  • 80xx - jenis sederhana
  • lainnya - offset relatif

Serikat Terenkapsulasi

Serikat terenkapsulasi berasal dari sintaksis serikat khusus di IDL. Secara efektif, serikat terenkapsulasi adalah struktur bundel dengan bidang diskriminan di awal struktur dan serikat sebagai satu-satunya anggota lain.

FC_ENCAPSULATED_UNION switch_type<1> 
memory_size<2>
union_arm_selector<>

Bidang> switch_type<1 serikat terenkapsulasi memiliki dua bagian. Nibble yang lebih rendah menyediakan jenis sakelar aktual, dan nibble atas memberikan kenaikan memori untuk melangkahi itu adalah jumlah yang harus ditambahkan penunjuk memori untuk melewati bidang switch_is, yang mencakup padding apa pun antara bidang switch_is() dari struktur yang dibangun stub dan bidang union aktual.

Bidang memory_size<2> adalah ukuran gabungan saja, dan identik dengan serikat yang tidak dienkapsulasi. Untuk mendapatkan ukuran total struktur yang berisi penyatuan, tambahkan memory_size<2> ke kenaikan memori untuk melangkahi, yaitu ke nibble atas bidang switch_type<1>, lalu selaraskan dengan keselarasan yang sesuai dengan kenaikan.

Serikat Tidak Terenkapsulasi

Gabungan yang tidak dienkapsulasi adalah situasi umum di mana gabungan adalah satu argumen atau bidang dan sakelar adalah argumen atau bidang lain.

FC_NON_ENCAPSULATED_UNION switch_type<1> 
switch_is_description<>
offset_to_size_and_arm_description<2>

Mana:

Bidang> switch_type<1 adalah karakter format untuk diskriminan.

Bidang switch_is_descriptor<> adalah deskriptor korelasi dan memiliki 4 atau 6 byte tergantung pada apakah/kuat digunakan. Namun, untuk switch_is_description<>, jika serikat disematkan dalam struktur, bidang offset switch_is_description<> adalah offset ke bidang switch_is dari posisi serikat dalam struktur (bukan dari awal struktur).

Bidang offset_to_size_and_arm_description<2> memberikan offset ke ukuran serikat dan deskripsi lengan, yang identik dengan itu untuk serikat yang dienkapsulasi dan dibagikan oleh semua serikat yang tidak dienkapsulasi dengan jenis yang sama :

memory_size<2> 
union_arm_selector<>