Rumah >pembangunan bahagian belakang >C++ >Mengapakah `std::memcpy` Tidak Ditakrifkan untuk Objek Tidak Boleh Disalin Secara Trivial?
Rentetan pengepala/bait/memcpy dalam C menentukan bahawa kelakuan std::memcpy ialah tidak ditentukan jika objek yang disalin tidak boleh disalin secara remeh. Ini bermakna jika anda cuba menggunakan memcpy pada jenis yang tidak boleh disalin secara remeh, atur cara akan memasuki keadaan tidak ditentukan dan apa sahaja boleh berlaku, termasuk ranap sistem, kerosakan data atau hasil yang tidak dijangka.
Jadi, mengapakah piawaian menganggap perlu untuk menyatakan perkara ini?
Dalam kes jenis yang boleh disalin secara remeh, operasi penyalinan ialah salinan mudah bitwise dari sumber kepada destinasi. Objek mempunyai reka letak memori yang sama dan tiada keperluan khas untuk operasi penyalinan dilakukan.
Walau bagaimanapun, jenis yang tidak boleh disalin secara remeh mungkin mempunyai pembina, pemusnah atau gelagat khas lain yang perlu dilaksanakan apabila objek disalin. Sebagai contoh, kelas mungkin mempunyai pembina yang memulakan penunjuk, atau pemusnah yang mengeluarkan sumber.
Jika anda menggunakan memcpy pada jenis yang tidak boleh disalin secara remeh, anda akan memintas gelagat istimewa ini, yang boleh menyebabkan kepada tingkah laku yang tidak ditentukan. Contohnya, jika anda menyalin objek tanpa memanggil pembinanya, objek itu mungkin tidak dimulakan dengan betul dan mengakses ahlinya boleh membawa kepada ranap sistem.
Standard menentukan bahawa kelakuan memcpy tidak ditentukan untuk bukan- jenis yang boleh disalin secara remeh untuk melindungi anda daripada masalah yang berpotensi ini. Dengan memaksa anda menggunakan pembina salinan atau pengendali tugasan yang betul, piawaian memastikan bahawa objek disalin dengan cara yang mengekalkan tingkah laku yang dimaksudkan.
Walaupun mungkin untuk mengelilingi gelagat yang tidak ditentukan dalam beberapa kes, ia tidak digalakkan. Adalah lebih baik untuk mengikut piawaian dan menggunakan mekanisme penyalinan yang betul untuk jenis anda yang tidak boleh disalin secara remeh.
Atas ialah kandungan terperinci Mengapakah `std::memcpy` Tidak Ditakrifkan untuk Objek Tidak Boleh Disalin Secara Trivial?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!