Rumah >pembangunan bahagian belakang >C++ >Mengapa Anda Tidak Boleh Menggunakan `std::string` dalam C Union?

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

Patricia Arquette
Patricia Arquetteasal
2024-11-16 17:58:03237semak imbas

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; // <--

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!

Kenyataan:
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