Spesifikasi C 11 menyatakan bahawa semua ungkapan baharu tatasusunan mungkin dikenakan overhed yang tidak ditentukan, termasuk yang merujuk kepada fungsi perpustakaan operator new[](std::size_t, void*) dan fungsi peruntukan peletakan lain. Overhed ini mungkin berbeza dengan setiap panggilan baharu.
Pertimbangkan contoh:
void* buffer = malloc(sizeof(std::string) * 10); std::string* p = ::new (buffer) std::string[10];
Mengikut spesifikasi, new (buffer) std::string[10] akan memanggil operator new[ ](sizeof(std::string) * 10 y, buffer), dengan y ialah overhed bukan negatif yang tidak ditentukan nilai. Jika y > 0, penimbal yang telah diperuntukkan tidak akan mencukupi.
Tidak mungkin untuk menentukan nilai overhed y dengan tepat daripada standard. Oleh itu, tidak disyorkan untuk menggunakan operator new[](std::size_t, void* p) melainkan anda mempunyai pengetahuan khusus tentang pelaksanaan platform.
Jika anda perlu menggunakan peletakan tatasusunan-baru dengan pra -penampan yang diperuntukkan, anda boleh mencipta fungsi baharu tatasusunan penempatan anda sendiri untuk menyemak overhed secara dinamik:
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; } int main() { alignas(std::string) char buffer[100]; std::string* p = new(buffer, sizeof(buffer)) std::string[3]; }
Dengan mengubah saiz tatasusunan dan memeriksa nilai n, anda boleh menyimpulkan overhed y untuk platform anda.
Atas ialah kandungan terperinci Apakah Overhed Tidak Ditentukan Adakah C 11 Penempatan Tatasusunan-Ungkapan Baharu Ditanggung?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!