Pendekatan tradisional untuk menaip punning, seperti yang ditunjukkan oleh fungsi punca kuasa dua songsang pantas, melibatkan mentafsir semula corak bit daripada satu jenis seperti yang lain menggunakan tuangan peringkat rendah. Walau bagaimanapun, pendekatan ini penuh dengan perangkap seperti:
Dalam C moden, terdapat beberapa mekanisme yang lebih selamat dan boleh dipercayai untuk jenis punning:
std::bit_cast menyalin corak bit x ke dalam objek baharu jenis T. Ia adalah kaedah yang disyorkan untuk menaip jenis kerana ia memastikan:
Menggunakan std::memcpy untuk menyalin bait antara lokasi memori ialah satu lagi pilihan selamat. Ia sesuai apabila:
Teknik ini boleh digunakan untuk mencipta objek baharu jenis T menggunakan memori objek sedia ada x:
new (&x) T; return *std::launder(reinterpret_cast<T*>(&x));
Ia adalah serupa dengan std::bit_cast tetapi membenarkan untuk mengubah suai kandungan memori sebelum menghantar.
std::byte mewakili satu bait, yang boleh digunakan untuk mentafsir semula corak bit jenis lain:
return *reinterpret_cast<T*>(reinterpret_cast<std::byte*>(&x));
Kaedah ini serupa dengan yang asal reinterpret_cast, tetapi ia membenarkan kawalan eksplisit ke atas susunan dan penjajaran bait.
Menggunakan std::bit_cast, fungsi punca kuasa dua songsang pantas boleh ditulis semula seperti berikut:
float fast_inverse_square_root(float number) { // Assuming sizeof(long) == sizeof(float) on target platform return std::bit_cast<float>(0x5f3759df - ( std::bit_cast<long>(number) >> 1 )); }
Versi ini selamat, berprestasi dan mematuhi amalan terbaik C moden.
Atas ialah kandungan terperinci Bagaimana Anda Boleh Menaip Punning dengan Selamat dalam C Moden?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!