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中文网其他相关文章!