Mengapa Anda Tidak Boleh Menggunakan `std::string` dalam C Union?

Patricia Arquette
Lepaskan: 2024-11-16 17:58:03
asal
164 orang telah melayarinya

Why Can't You Use `std::string` in a C   Union?

Mengapa Pengkompil Tidak Membenarkan std::string dalam Unions?

Apabila bekerja dengan C, selalunya perlu menggunakan struktur data yang boleh menyimpan pelbagai jenis data. Satu struktur sedemikian ialah kesatuan, yang memberikan berbilang pembolehubah ke lokasi memori yang sama. Walau bagaimanapun, satu persoalan biasa timbul mengenai batasan kesatuan terhadap ahli mereka.

Satu sekatan penting ialah ketidakupayaan untuk memasukkan kelas dengan pembina salinan bukan remeh dalam kesatuan. Ini termasuk kelas seperti std::string. Untuk memahami sebabnya, pertimbangkan senario berikut:

union U {
  std::string x;
  std::vector<int> y;
};

U u; // <--
Salin selepas log masuk

Secara tradisinya, dalam struct, memulakan u.x atau u.y akan menetapkannya kepada nilai lalai. Walau bagaimanapun, dalam kesatuan, semua ahli berkongsi alamat yang sama, menjadikannya mustahil untuk memberikan nilai kepada kedua-dua ahli tanpa menimpa data. Jika tiada ahli dimulakan, menggunakannya akan mengakibatkan tingkah laku yang tidak ditentukan.

C 98 menangani isu ini dengan melarang kelas dengan pembina bukan remeh daripada menjadi ahli kesatuan. Secara khusus, ia dinyatakan dalam §9.5/1:

"Objek kelas dengan pembina bukan remeh (12.1), pembina salinan bukan remeh (12.8), pemusnah bukan remeh (12.4) , atau pengendali tugasan salinan bukan remeh (13.5.3, 12.8) tidak boleh menjadi ahli kesatuan, begitu juga susunan objek sedemikian."

Sekatan ini memastikan manipulasi data dalam kesatuan boleh dikendalikan dengan berkesan.

C 0x melonggarkan peraturan ini sedikit sebanyak (§9.5/2), membenarkan paling banyak satu ahli data bukan statik dengan pemula pendakap atau sama. Walau bagaimanapun, menulis pembina dan pemusnah salinan bebas ralat untuk kesatuan masih rumit. Atas sebab ini, kesatuan teg atau perpustakaan pihak ketiga seperti boost::variant dan boost:: any menyediakan penyelesaian alternatif untuk bekerja dengan data heterogen.

Atas ialah kandungan terperinci Mengapa Anda Tidak Boleh Menggunakan `std::string` dalam C Union?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan