Rumah > pembangunan bahagian belakang > C++ > Adakah memcpy Membina Objek Boleh Disalin Secara Trivial dalam C?

Adakah memcpy Membina Objek Boleh Disalin Secara Trivial dalam C?

Linda Hamilton
Lepaskan: 2024-11-08 15:11:02
asal
1033 orang telah melayarinya

Does memcpy Construct Trivially Copyable Objects in C  ?

Menyingkap Keserasian "membina" Objek Boleh Disalin Secara Trivial dengan memcpy

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);
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan