首页 >后端开发 >C++ >在 C 中使用 Placement-New 进行数组分配时如何考虑开销?

在 C 中使用 Placement-New 进行数组分配时如何考虑开销?

Barbara Streisand
Barbara Streisand原创
2024-12-12 14:12:10848浏览

How to Account for Overhead When Using Placement-New for Array Allocation in C  ?

数组放置新:确定缓冲区中未指定的开销

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn