Rumah > pembangunan bahagian belakang > C++ > Berapa Banyak Ruang Penampan yang Benar-benar Diperlukan untuk Tatasusunan Baharu Penempatan C?

Berapa Banyak Ruang Penampan yang Benar-benar Diperlukan untuk Tatasusunan Baharu Penempatan C?

DDD
Lepaskan: 2024-12-29 06:37:09
asal
520 orang telah melayarinya

How Much Buffer Space is Really Needed for C   Placement-New Arrays?

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];
Salin selepas log masuk

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 << &quot;life is good\n&quot;;
    else
        throw std::bad_alloc();
    return p;
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan