Kebimbangan Apabila Menggunakan "memcpy" untuk Membina Objek Boleh Disalin Secara Trivial
Dalam C , kesahihan menggunakan "memcpy" untuk membina objek yang remeh jenis yang boleh disalin telah menjadi subjek perdebatan. Artikel ini meneroka nuansa dan ketidakpastian yang mengelilingi kod ini:
#include <cstdlib> #include <cstring> struct T // trivially copyable type { 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); }
Seumur Hidup Objek Tidak Pasti dengan "memcpy""
Inti persoalannya terletak pada menentukan sama ada " *b" mewakili objek yang hayatnya telah dimulakan dan, jika ya, apabila hayat ini bermula. Piawaian C masih berdiam diri mengenai perkara ini.
Cadangan untuk Penciptaan Objek Tersirat dan Status Semasa
Untuk menangani kekaburan ini, cadangan p0593 telah dikemukakan, menyokong penciptaan objek tersirat semasa rendah operasi manipulasi objek peringkat seperti "malloc" dan "memcpy." senario. Walau bagaimanapun, cadangan ini masih belum disemak secara rasmi.
Garis Panduan daripada Draf C 14 Standard
Seperti dalam bahagian standard draf C 14 1.8 [intro. objek], objek dicipta terutamanya melalui definisi, ungkapan baharu atau proses pelaksanaan tertentu Bahagian 3.9 [basic.types] yang berkaitan dengan jenis yang boleh disalin secara remeh menyatakan bahawa menyalin bait objek tersebut adalah dibenarkan, dengan syarat nilai dipulihkan dengan sewajarnya.
Perbincangan Berterusan dan Pendekatan Alternatif
"Senarai mel ub" telah memudahkan perbincangan yang rancak mengenai topik ini, memfokuskan kepada mengelakkan menyalin melalui punning jenis.
Kesimpulan
Persoalan "membina" objek yang boleh disalin secara remeh dengan "memcpy" kekal tidak dapat diselesaikan dalam standard C, meninggalkan ruang untuk potensi yang tidak ditentukan tingkah laku. Perbincangan dan cadangan yang berterusan, seperti p0593, bertujuan untuk menjelaskan dan menangani isu ini, membawa kepastian yang lebih besar kepada manipulasi objek peringkat rendah dalam C .
Atas ialah kandungan terperinci Adakah 'memcpy' Cara Sah untuk Membina Objek Boleh Disalin Secara Trivial dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!