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

Adakah 'memcpy' Cara Sah untuk Membina Objek Boleh Disalin Secara Trivial dalam C ?

Patricia Arquette
Lepaskan: 2024-11-09 17:39:02
asal
971 orang telah melayarinya

Is

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, &amp;a, sizeof a);
    T *b = static_cast<T *>(buf);

    b->x = b->y;

    free(buf);
}
Salin selepas log masuk

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!

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