Pertanyaan Ketik Ciri-ciri dari kelas C ++ yang bisa diserviskan


Saya memiliki kelas C ++ yang didefinisikan sebagai A a; yang saya ingin bersambung. Cara termudah untuk melakukan ini (ketika berhasil) adalah

write(fd, reinterpret_cast<uint8_t*>(&a), sizeof(a));

dan membacanya kembali menggunakan:

read(fd, reinterpret_cast<uint8_t*>(&a), sizeof(a));

Saya tahu ini akan berhasil jika std::is_pod<A>::value adalah tipe-tipe yang benar tetapi apa tipe tipe-tipe yang paling rileks A harus exibit untuk ini untuk bekerja?

Hanya untuk kelengkapan, ini adalah untuk ketekunan antara menjalankan contoh aplikasi, tidak ada kebutuhan untuk file yang dapat dibaca oleh program lain atau pada platform lain.


4
2017-08-15 10:17


asal


Jawaban:


Menulis gambar bitwise dari suatu objek ke dalam aliran dan mengembalikannya dengan benar dengan membaca dari aliran itu persis sama dengan objek yang berperilaku dengan benar di bawah memcpy. Dan untuk itu, ada properti khusus yang dimulai sepele yang bisa ditagih. Jadi sifat yang ingin Anda gunakan adalah std::is_trivially_copyable<A>.


Catatan samping yang tidak terkait: Kode Anda secara teoritis dapat memiliki Perilaku Tidak Terdefinisi. Itu karena C ++ hanya mengizinkan aliasing melalui tipe char dan unsigned char, dan tidak ada jaminan itu std::uint8_t adalah alias untuk salah satunya. Anda sebaiknya menggunakan unsigned char secara eksplisit:

write(fd, reinterpret_cast<unsigned char*>(&a), sizeof(a));

6
2017-08-15 10:22



Apa yang Anda cari adalah is_trivially_copyable, sesuai jawaban yang agnew. Namun, ini tidak berarti trivially serializable karena

  • ukuran tipe data yang berbeda pada berbagai kompiler / opsi kompilasi
  • pelurusan yang berbeda pada kompiler / platforls / opsi kompilasi yang berbeda
  • urutan byte pada platform yang berbeda

Selanjutnya, kamu akan mengalami masalah dengan versi, dan arti data mungkin berbeda pada mesin eksekusi yang berbeda.

Itu sebabnya saya akan merekomendasikan untuk memperkenalkan sifat khusus,is_doron_serializabe, dan menjadikannya default false untuk jenis yang tidak secara explisit ditandai sebagai kompatibel.

(Apa yang Anda rencanakan mungkin baiklah dalam situasi tertentu.)


3
2017-08-15 10:27