Rumah > pembangunan bahagian belakang > C++ > Apakah Overhed Tidak Ditentukan Adakah C 11 Penempatan Tatasusunan-Ungkapan Baharu Ditanggung?

Apakah Overhed Tidak Ditentukan Adakah C 11 Penempatan Tatasusunan-Ungkapan Baharu Ditanggung?

DDD
Lepaskan: 2024-12-13 19:07:14
asal
510 orang telah melayarinya

What Unspecified Overhead Do C  11 Array Placement-New Expressions Incur?

Overhed Baharu Penempatan Tatasusunan dalam Penampan

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

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.

Menentukan Saiz Penampan Yang Diperlukan

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

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!

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