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中文網其他相關文章!