Penempatan Tatasusunan-Baharu: Memahami Kesan Overhed Tidak Ditentukan
Piawaian C mewajibkan bahawa peletakan tatasusunan-ungkapan baharu mungkin dikenakan overhed yang tidak ditentukan dalam penimbal yang diperuntukkan. Overhed ini, yang diwakili oleh pembolehubah x dan y, boleh berbeza-beza antara seruan baharu yang berbeza.
Pertimbangkan kod contoh:
void* buffer = malloc(sizeof(std::string) * 10); std::string* p = ::new (buffer) std::string[10];
Menurut piawaian, ungkapan peletakan-baru baharu ( buffer) std::string[10] secara dalaman akan memanggil operator new[](sizeof(std::string) * 10 y, penimbal).
Walau bagaimanapun, ini menimbulkan kebimbangan: jika y lebih besar daripada 0, penimbal penimbal yang telah diperuntukkan mungkin terlalu kecil, membawa kepada ralat masa jalan.
Bagaimana untuk Menentukan Saiz Penampan Yang Diperlukan
Piawaian tidak menjamin bahawa y akan sentiasa 0. Untuk memastikan bahawa penimbal yang telah diperuntukkan adalah mencukupi, anda boleh mengira secara manual overhed tambahan yang diperlukan. Malangnya, ini memerlukan pengetahuan tentang butiran pelaksanaan khusus platform.
Alternatif: Pendekatan Pelaksanaan-Agnostik
Untuk mengelakkan bergantung pada pengetahuan khusus pelaksanaan, anda boleh menggunakan pelaksanaan baharu tatasusunan penempatan sendiri yang menyemak overhed semasa masa jalan:
inline void* operator new[](std::size_t n, void* p, std::size_t limit) { if (n <= limit) std::cout << "life is good\n"; else throw std::bad_alloc(); return p; }
Dengan mengubah saiz tatasusunan dan memeriksa n dalam contoh di atas, anda boleh menyimpulkan nilai y untuk platform khusus anda.
Kemas kini: Penghapusan Overhed
Nicol Bolas telah menyerlahkan bahawa setakat November 2019, laporan kecacatan membetulkan isu ini, memastikan y sentiasa 0 untuk pengendali baharu[](std::size_t, batal* p). Perubahan ini digunakan secara retroaktif pada semua versi C . Oleh itu, anggaran overhed tidak lagi diperlukan.
Atas ialah kandungan terperinci Berapa Banyak Ruang Penampan yang Benar-benar Diperlukan untuk Tatasusunan Baharu Penempatan C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!