Struktur (RPC)

Ada beberapa kategori struktur, secara progresif lebih rumit dalam hal tindakan yang diperlukan untuk marshaling. Mereka dimulai dengan struktur sederhana yang dapat disalin secara keseluruhan, dan berlanjut ke struktur kompleks yang harus dilayakan bidang demi bidang.

Catatan

Jika dibandingkan dengan kategori array, menjadi jelas bahwa hanya struktur hingga 64k yang dapat dijelaskan (ukurannya adalah untuk bagian datar dari struktur), yang tidak ada yang setara dengan array SM dan LG.

 

Anggota Umum untuk Struktur

  • Alignment

    Penyelarasan buffer yang diperlukan sebelum membatalkan nama struktur. Nilai yang valid adalah 0, 1, 3, dan 7 (perataan aktual dikurangi 1).

  • memory_size

    Ukuran struktur dalam memori dalam byte; untuk struktur yang sesuai ukuran ini tidak menyertakan ukuran array.

  • offset_to_array_description

    Offset dari penunjuk string format saat ini ke deskripsi array yang sesuai yang terkandung dalam struktur.

  • member_layout

    Deskripsi setiap elemen struktur. Rutinitas NDR hanya perlu memeriksa bagian string format jenis ini jika transformasi endian diperlukan atau jika jenisnya adalah struktur yang kompleks.

  • pointer_layout

    Lihat bagian Tata Letak Penunjuk.

Struktur Sederhana

Struktur sederhana hanya berisi jenis dasar, array tetap, dan struktur sederhana lainnya. Fitur utama dari struktur sederhana adalah dapat disalin secara keseluruhan.

FC_STRUCT alignment<1> 
memory_size<2> 
member_layout<> 
FC_END

Struktur Sederhana dengan Pointer

Struktur sederhana dengan pointer hanya berisi jenis dasar, pointer, array tetap, struktur sederhana, dan struktur sederhana lainnya dengan pointer. Karena tata letak hanya harus dikunjungi saat melakukan konversi endianness, tata letak<> ditempatkan di akhir deskripsi.

FC_PSTRUCT alignment<1> 
memory_size<2> 
pointer_layout<> 
member_layout<> 
FC_END

Struktur Yang Sesuai

Struktur yang sesuai hanya berisi jenis dasar, array tetap, dan struktur sederhana, dan harus berisi string yang sesuai atau array yang sesuai. Array ini sebenarnya dapat terkandung dalam struktur lain yang sesuai atau struktur yang sesuai dengan pointer yang disematkan dalam struktur ini.

FC_CSTRUCT alignment<1> 
memory_size<2> 
offset_to_array_description<2> 
member_layout<> 
FC_END

Struktur Sesuai dengan Penunjuk

Struktur yang sesuai dengan pointer hanya berisi jenis dasar, pointer, array tetap, struktur sederhana, dan struktur sederhana dengan penunjuk; struktur yang sesuai harus berisi array yang sesuai. Array ini sebenarnya dapat terkandung dalam struktur lain yang sesuai atau struktur yang sesuai dengan pointer yang disematkan dalam struktur ini.

FC_CPSTRUCT alignment<1> 
memory_size<2> 
offset_to_array_description<2> 
pointer_layout<> 
member_layout<> FC_END

Struktur Variasi Yang Sesuai (dengan atau tanpa Penunjuk)

Struktur variasi yang sesuai hanya berisi jenis sederhana, pointer, array tetap, struktur sederhana, dan struktur sederhana dengan penunjuk; struktur variasi yang sesuai harus berisi string yang sesuai atau array yang bervariasi sesuai. String atau array yang sesuai sebenarnya dapat dimuat dalam struktur lain yang sesuai atau struktur yang sesuai dengan pointer yang disematkan dalam struktur ini.

FC_CVSTRUCT alignment<1> 
memory_size<2> 
offset_to_array_description<2> 
[pointer_layout<>] 
layout<> 
FC_END

Struktur Keras

Struktur keras adalah konsep yang bertujuan untuk menghilangkan penalti curam yang terkait dengan pemrosesan struktur yang kompleks. Ini berasal dari pengamatan bahwa struktur yang kompleks biasanya hanya memiliki satu atau dua kondisi yang mencegah penyalinan blok, dan karena itu merusak performanya dibandingkan dengan struktur sederhana. Pelakunya biasanya adalah serikat pekerja atau bidang enumerasi.

Struktur keras adalah struktur yang memiliki enum16, end-padding dalam memori, atau serikat sebagai anggota terakhir. Ketiga elemen ini mencegah struktur masuk ke dalam salah satu kategori struktur sebelumnya, yang menikmati overhead interpretasi kecil dan potensi pengoptimalan maksimum, tetapi tidak memaksanya ke dalam kategori struktur yang sangat kompleks.

Enum16 tidak boleh menyebabkan ukuran memori dan kawat struktur berbeda. Struktur tidak boleh memiliki array yang sesuai, atau penunjuk apa pun (kecuali bagian dari serikat pekerja); satu-satunya anggota lain yang diizinkan adalah jenis dasar, array tetap, dan struktur sederhana.

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

Bidang enum_offset<2> menyediakan offset dari awal struktur dalam memori ke enum16 jika berisi satu; jika tidak, bidang enum_offset<2> adalah –1.

Bidang copy_size<2> menyediakan jumlah total byte dalam struktur, yang mungkin disalin blok ke/dari buffer. Total ini tidak termasuk serikat berikutnya atau end-padding dalam memori. Nilai ini juga merupakan jumlah penunjuk buffer yang harus ditahapkan mengikuti salinan.

Bidang mem_copy_incr<2> adalah jumlah byte yang harus ditambahkan setelah salinan blok sebelum menangani penyatuan berikutnya. Bertambah dengan jumlah ini (bukan dengan copy_size<2> byte) menghasilkan penunjuk memori yang tepat ke union berikutnya.

Struktur Kompleks

Struktur kompleks adalah struktur apa pun yang berisi satu atau beberapa bidang yang mencegah struktur disalin blok, atau yang pemeriksaan tambahannya harus dilakukan selama marshaling atau unmarshaling (misalnya, pemeriksaan terikat pada enumerasi). Jenis NDR berikut termasuk dalam kategori ini:

  • jenis sederhana: ENUM16, __INT3264 (hanya pada platform 64-bit), integral dengan [rentang]
  • perataan padding di akhir struktur
  • penunjuk antarmuka (mereka menggunakan kompleks yang disematkan)
  • pointer yang diabaikan (yang terkait dengan atribut [abaikan] dan token FC_IGNORE)
  • array kompleks, array yang bervariasi, array string
  • array konforman multidisipional dengan setidaknya satu dimensi nonfiks
  • Serikat
  • elemen yang ditentukan dengan [transmit_as], [represent_as], [wire_marshal], [user_marshal]
  • struktur kompleks yang disematkan
  • padding di akhir struktur

Struktur kompleks memiliki deskripsi format berikut:

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<>]

Bidang memory_size<2> adalah ukuran struktur dalam memori, dalam byte.

Jika struktur berisi array yang sesuai, bidang offset_to_conformant_array_description<2> menyediakan offset ke deskripsi array yang sesuai, jika tidak, itu adalah nol.

Jika struktur memiliki penunjuk, bidang offset_to_pointer_layout<2> menyediakan offset melewati tata letak struktur ke tata letak penunjuk, jika tidak, bidang ini adalah nol.

Bidang pointer_layout<> struktur kompleks ditangani agak berbeda dari untuk struktur lainnya. Bidang pointer_layout<> struktur kompleks hanya berisi deskripsi bidang penunjuk aktual dalam struktur itu sendiri. Setiap pointer yang terkandung dalam array, serikat, atau struktur yang disematkan tidak dijelaskan dalam bidang pointer_layout<> struktur kompleks.

Catatan

Ini berbeda dengan struktur lain, yang menduplikasi deskripsi pointer apa pun yang terkandung dalam array atau struktur yang disematkan di bidang _layout<> pointer mereka sendiri.

 

Format tata letak penunjuk struktur kompleks juga berbeda secara radikal. Karena hanya berisi deskripsi anggota penunjuk aktual dan karena struktur kompleks dinaungi dan tidak dirusak satu bidang pada satu waktu, bidang pointer_layout<> hanya berisi deskripsi penunjuk dari semua anggota penunjuk. Tidak ada FC_PP awal, dan tidak ada informasi pointer_layout<> biasa.

Deskripsi Tata Letak Anggota Struktur

Deskripsi tata letak struktur berisi satu atau beberapa karakter format berikut:

  • Salah satu karakter jenis dasar, seperti FC_CHAR, dan sebagainya

  • Arahan perataan. Ada tiga karakter format yang menentukan perataan penunjuk memori: FC_ALIGNM2, FC_ALIGNM4, dan FC_ALIGNM8.

    Catatan

    Ada juga token perataan buffer, FC_ALIGNB2 melalui FC_ALIGNM8; ini tidak digunakan.

     

  • Memori padding. Ini hanya terjadi di akhir deskripsi struktur dan menunjukkan jumlah byte padding dalam memori sebelum array yang sesuai dalam struktur: FC_STRUCTPADn, di mana n adalah jumlah byte padding.

  • Jenis nonbase yang disematkan (catatan, bagaimanapun, bahwa array yang sesuai tidak pernah terjadi dalam tata letak struktur). Ini memiliki deskripsi 4-byte:

    FC_EMBEDDED_COMPLEX memory_pad<1> 
    offset_to_description<2>,
    

    di mana offset tidak dijamin selaras 2 byte.

    <memory_pad 1> adalah padding yang diperlukan dalam memori sebelum bidang kompleks.

    <offset_to_description 2> adalah offset jenis relatif ke jenis yang disematkan.

Mungkin juga ada FC_PAD sebelum penghentian FC_END jika diperlukan untuk memastikan bahwa string format akan diratakan pada batas 2 byte setelah FC_END.