Dalam C , operator penempatan-baharu membenarkan objek dibina terus dalam memori yang diperuntukkan terlebih dahulu. Apabila menggunakan penempatan-baru untuk memperuntukkan tatasusunan, adalah penting untuk mengambil kira potensi overhed tidak ditentukan yang ditanggung oleh operasi.
Piawaian C 11 menentukan bahawa ungkapan penempatan-baharu baru(penampan) T[5] memanggil operator baru[](saiz(T)*5 y, penimbal). Di sini, y mewakili nilai overhed bukan negatif yang berbeza dari seruan kepada seruan. Overhed ini boleh memberi kesan kepada saiz penimbal yang dipraperuntukkan jika nilainya lebih besar daripada sifar.
Pertimbangkan coretan kod berikut:
void* buffer = malloc(sizeof(std::string) * 10); std::string* p = ::new (buffer) std::string[10];
Tanpa pengetahuan awal tentang y, sukar untuk ditentukan jumlah memori yang sesuai untuk diperuntukkan untuk penimbal. Jika y lebih besar daripada sifar, penimbal yang diperuntukkan mungkin tidak mencukupi.
Untuk menangani isu ini, piawaian pada mulanya meninggalkan tanggungjawab untuk menentukan overhed kepada butiran pelaksanaan. Ketidakpastian ini sering memaksa pembangun untuk mengelak daripada menggunakan operator new[](std::size_t, void* p) atau melaksanakan tatasusunan penempatan mereka-operator baharu untuk semakan masa jalan.
Kemas kini
Nasib baik, laporan kecacatan pada tahun 2019 membetulkan isu ini dengan mengubah suai standard untuk menentukan bahawa y sentiasa sifar untuk operator baru[](std::size_t, void* p). Pelarasan ini terpakai secara retroaktif pada semua versi C , memberikan gelagat peruntukan yang konsisten dan boleh diramal.
Oleh itu, penentuan overhed yang tidak ditentukan tidak lagi diperlukan apabila menggunakan peletakan-baharu untuk memperuntukkan tatasusunan secara langsung dalam memori praperuntukan. Pembangun boleh menggunakan operator new[](std::size_t, void* p) dengan selamat tanpa bimbang tentang melebihi saiz penimbal.
Atas ialah kandungan terperinci Bagaimana untuk Mengakaun Overhed Apabila Menggunakan Peletakan-Baru untuk Peruntukan Tatasusunan dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!