在 C 中,placement-new 运算符允许直接在预先分配的内存中构造对象。当使用placement-new来分配数组时,必须考虑操作所产生的潜在的未指定开销。
C 11标准规定placement-new表达式new(buffer) T[5]调用运算符 new[](sizeof(T)*5 y, buffer)。这里,y 表示非负开销值,该值随调用而变化。如果预分配缓冲区的值大于零,则此开销可能会影响预分配缓冲区的大小。
考虑以下代码片段:
void* buffer = malloc(sizeof(std::string) * 10); std::string* p = ::new (buffer) std::string[10];
如果事先不知道 y,则很难确定为缓冲区分配适当的内存量。如果 y 大于零,则分配的缓冲区可能不足。
为了解决这个问题,标准最初将确定开销的责任留给了实现细节。这种不确定性常常迫使开发人员避免使用运算符 new[](std::size_t, void* p) 或实现放置数组新运算符来进行运行时检查。
更新
幸运的是,2019 年的一份缺陷报告通过修改标准来指定 y 始终为零来纠正这个问题新[](std :: size_t,void * p)。此调整追溯适用于 C 的所有版本,提供一致且可预测的分配行为。
因此,当使用placement-new 直接在预分配内存中分配数组时,不再需要确定未指定的开销。开发者可以安全地使用operator new[](std::size_t, void* p),而不用担心超出缓冲区大小。
以上是在 C 中使用 Placement-New 进行数组分配时如何考虑开销?的详细内容。更多信息请关注PHP中文网其他相关文章!