数组放置新:了解未指定开销的影响
C 标准要求数组放置新表达式可能会产生未指定的开销分配的缓冲区。由变量 x 和 y 表示的开销在 new 的不同调用之间可能会有所不同。
考虑示例代码:
void* buffer = malloc(sizeof(std::string) * 10); std::string* p = ::new (buffer) std::string[10];
根据标准,placement-new 表达式 new ( buffer) std::string[10] 将在内部调用operator new[](sizeof(std::string) * 10 y,
但是,这引起了一个问题:如果 y 大于 0,则预分配的缓冲区 buffer 可能太小,导致运行时错误。
如何确定所需的缓冲区大小
标准不保证 y 始终为 0。要确保预先分配的缓冲区就足够了,您可以手动计算所需的额外开销。不幸的是,这需要了解特定于平台的实现细节。
替代方案:与实现无关的方法
为了避免依赖特定于实现的知识,您可以使用自己的放置数组新实现,用于检查运行时的开销:
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; }
通过改变数组大小并检查示例中的 n如上所述,您可以推断出特定平台的 y 值。
更新:消除开销
Nicol Bolas 强调指出,截至 2019 年 11 月,缺陷报告修复了此问题,确保运算符 new[](std::size_t, void* p) 的 y 始终为 0。此更改追溯适用于 C 的所有版本。因此,不再需要开销估算。
以上是C 放置新数组确实需要多少缓冲区空间?的详细内容。更多信息请关注PHP中文网其他相关文章!