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
DDDasal
2024-12-13 19:07:14423semak imbas

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];

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];
}

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:
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