Dalam bidang pengaturcaraan C, membina objek boleh disalin secara remeh menggunakan kaedah salinan bitwise seperti memcpy mempunyai mencetuskan perdebatan mengenai seumur hidup objek. Timbul persoalan: Adakah objek yang ditunjuk oleh b dalam kod berikut dijamin mempunyai jangka hayat yang jelas?
struct T { int x, y; }; int main() { void *buf = std::malloc(sizeof(T)); if (!buf) return 0; T a{}; std::memcpy(buf, &a, sizeof a); T *b = static_cast<T *>(buf); b->x = b->y; free(buf); }
Isu Yang Tidak Selesai
C standard masih samar-samar mengenai perkara ini, walaupun perbincangan dan cadangan berterusan. Kekurangan panduan yang jelas menyebabkan soalan ini tidak terjawab, dengan implikasi untuk alat analisis berasaskan semantik, pengoptimum dan penjejakan seumur hidup.
Cadangan N3751
N3751 mencadangkan mengenali memcpy operasi yang melibatkan objek boleh salin remeh yang berbeza sebagai pembinaan objek, menyokong IO binari sambil mengekalkan keupayaan analisis seumur hidup.
C 14 Standard
Piawaian C 14 mentakrifkan penciptaan objek sebagai berlaku melalui definisi, ungkapan baharu atau apabila pelaksanaan menganggapnya perlu. Bahasa semasa tidak secara eksplisit menangani penggunaan memcpy untuk membina objek.
std::Pelaksanaan vektor
Pelaksanaan semasa std::vector menyerlahkan senario praktikal di mana isu ini timbul, membawa kepada tingkah laku yang tidak ditentukan.
Cadangan p0593: Penciptaan Objek Tersirat
Cadangan p0593 bertujuan untuk menangani kekaburan ini dengan mentakrifkan secara jelas senario di mana objek dicipta secara tersirat , termasuk panggilan ke malloc dan memcpy. Ia mencadangkan mekanisme untuk mencipta objek atas permintaan, memberikan tingkah laku yang ditentukan oleh program. Walau bagaimanapun, cadangan ini masih dalam semakan.
Kesimpulan
Status pembinaan objek menggunakan memcpy kekal sebagai topik perdebatan berterusan dalam komuniti C. Sehingga kata sepakat dicapai dan standard dikemas kini, gelagat kod seperti contoh yang diberikan kekal tidak ditentukan, yang berpotensi membawa kepada gelagat program yang tidak dapat diramalkan.
Atas ialah kandungan terperinci Adakah memcpy Membina Objek Boleh Disalin Secara Trivial dalam C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!