C 11 標準指定放置新表達式new(buffer) T[5] 將導致呼叫到運算符new [](sizeof(T)*5 y,buffer) 其中x 和y 是表示陣列分配的非負、未指定值開銷。
但是,在使用具有預先分配緩衝區的placement-new 時,這會造成問題。如果 y 大於 0,則分配的緩衝區可能不足以容納陣列。
由於標準不保證 y 的值,因此至關重要在運行時確定它。一種方法是建立一個自訂的 Placement-new 運算子來檢查可用的緩衝區空間。
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; }
透過改變陣列大小並檢查自訂new 運算子中的n,您可以推斷出y 的值
需要注意的是,缺陷報告已於2019 年11 月修復了此問題,可追溯至C 的所有版本。根據更新後的標準,operator new[](std::size_t, void* p) 的開銷總是零。
因此,在使用函式庫函數operator new[](std::size_t, void*),您可以預先分配確切大小的緩衝區,而不必擔心未指定的分配開銷。
以上是放置新數組分配到底有多少開銷?的詳細內容。更多資訊請關注PHP中文網其他相關文章!