Ketika saya membaca kode sumber seastar , saya perhatikan bahwa ada struktur gabungan tx_side
yang hanya memiliki satu anggota. Apakah ini beberapa hack untuk menangani masalah tertentu?
FYI, saya tempel tx_side
struktur di bawah ini:
union tx_side {
tx_side() {}
~tx_side() {}
void init() { new (&a) aa; }
struct aa {
std::deque<work_item*> pending_fifo;
} a;
} _tx;
union
bukannyastruct
satu atau lebih perbedaan antara keduanya. Ini adalah teknik yang sangat tidak jelas sehingga kecuali penulis asli kode itu datang, saya tidak yakin seseorang dapat memberi Anda jawaban otoritatif yang masalah mereka berharap untuk menyelesaikan dengan ini (jika ada).Jawaban:
Karena
tx_side
adalah suatu kesatuan,tx_side()
tidak secara otomatis menginisialisasi / membanguna
, dan~tx_side()
tidak secara otomatis merusaknya. Hal ini memungkinkan kontrol dengan baik selama masa pakaia
danpending_fifo
, melalui penempatan destruktor-baru dan manual (orang miskinstd::optional
).Ini sebuah contoh:
Di sini,
B b;
tidak mencetak apa pun, karenaa
tidak dibangun atau dihancurkan.Jika
B
itu adalahstruct
,B()
akan memanggilA()
, dan~B()
akan memanggil~A()
, dan Anda tidak akan dapat mencegahnya.sumber
int
Anda mungkin mendapatkan0xCCCCCCCC
. Membaca data yang tidak diinisialisasi adalah Perilaku Tidak Terdefinisi, dan apa yang mungkin terjadi adalah bahwa kompiler hanya membuang upaya. Ini bukan hanya teori. Debian membuat kesalahan yang tepat ini, dan itu merusak implementasi OpenSSL mereka. Mereka memiliki beberapa byte acak nyata, menambahkan variabel tidak diinisialisasi, dan kompiler mengatakan "baik hasilnya tidak terdefinisi, jadi mungkin juga nol". Nol jelas tidak acak lagi.!= 0
perbandingan berikutnya menghasilkan true. Saya telah menambahkan flag kompiler untuk memperlakukan variabel yang tidak diinisialisasi sebagai kesalahan untuk memastikan saya tidak akan jatuh ke dalam perangkap itu lagi.Dengan kata-kata sederhana, kecuali jika secara eksplisit menetapkan / menginisialisasi nilai, anggota tunggal tidak menginisialisasi memori yang dialokasikan. Fungsi ini dapat dicapai dengan
std:: optional
di c ++ 17.sumber