首頁 > 後端開發 > C++ > C 11 陣列放置新表達式會產生哪些未指定的開銷?

C 11 陣列放置新表達式會產生哪些未指定的開銷?

DDD
發布: 2024-12-13 19:07:14
原創
425 人瀏覽過

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

緩衝區中的數組放置新開銷

C 11 規範規定所有數組new 表達式可能會產生未指定的開銷,包括那些引用庫函數的開銷operator new[](std::size_t, void*) 和其他佈局分配函數。此開銷可能會因每次呼叫 new 而異。

考慮以下範例:

void* buffer = malloc(sizeof(std::string) * 10);
std::string* p = ::new (buffer) std::string[10];
登入後複製

根據規範,new (buffer) std::string[10] 將呼叫運算子new[ ](sizeof(std::string) * 10 y, buffer),其中y 是未指定的非負開銷值。如果y> 0,預先分配的緩衝區將不足。

決定所需的緩衝區大小

無法根據標準精確決定 y 開銷值。因此,除非您對平台的實作有具體了解,否則不建議使用operator new[](std::size_t, void* p)。

如果您需要使用陣列placement-new和pre - 指派的緩衝區,您可以建立自己的放置陣列新函數來動態檢查開銷:

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];
}
登入後複製

透過改變陣列大小並檢查n 值,您可以推斷y 平台的開銷。

以上是C 11 陣列放置新表達式會產生哪些未指定的開銷?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板