Rumah >pembangunan bahagian belakang >C++ >Berapa Banyak Overhed Yang Sebenarnya Ada Peruntukan Tatasusunan-Baharu?
Piawaian C 11 menentukan bahawa ungkapan penempatan-baru new(buffer) T[5] akan menghasilkan panggilan kepada operator baru[](saiz(T)*5 y,penampan) dengan x dan y bukan negatif, nilai yang tidak ditentukan mewakili overhed peruntukan tatasusunan.
Walau bagaimanapun, ini menimbulkan kebimbangan apabila menggunakan peletakan-baharu dengan penimbal yang telah diperuntukkan sebelumnya. Jika y lebih besar daripada 0, penimbal yang diperuntukkan mungkin tidak cukup besar untuk menampung tatasusunan.
Memandangkan piawaian tidak menjamin nilai y, ia adalah penting untuk menentukannya semasa runtime. Satu pendekatan ialah mencipta pengendali baharu peletakan tersuai yang menyemak ruang penimbal yang tersedia.
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 operator baharu tersuai, anda boleh membuat kesimpulan nilai y untuk anda platform.
Adalah penting untuk ambil perhatian bahawa laporan kecacatan telah membetulkan isu ini pada November 2019, menjadikannya retroaktif kepada semua versi C . Mengikut piawaian yang dikemas kini, overhed untuk operator new[](std::size_t, void* p) sentiasa sifar.
Oleh itu, apabila menggunakan operator function library new[](std::size_t, void*), anda boleh pra-peruntukkan penimbal anda dengan saiz yang tepat tanpa perlu risau tentang overhed peruntukan yang tidak ditentukan.
Atas ialah kandungan terperinci Berapa Banyak Overhed Yang Sebenarnya Ada Peruntukan Tatasusunan-Baharu?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!