Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Mengakaun Overhed Apabila Menggunakan Peletakan-Baru untuk Peruntukan Tatasusunan dalam C ?

Bagaimana untuk Mengakaun Overhed Apabila Menggunakan Peletakan-Baru untuk Peruntukan Tatasusunan dalam C ?

Barbara Streisand
Barbara Streisandasal
2024-12-12 14:12:10850semak imbas

How to Account for Overhead When Using Placement-New for Array Allocation in C  ?

Penempatan Tatasusunan-Baharu: Menentukan Overhed Tidak Ditentukan dalam Penampan

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!

Kenyataan:
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