小编典典

“安置新”有什么用?

all

这里有人用过 C++ 的“placement new”吗?如果有,是为了什么?在我看来,它只对内存映射硬件有用。


阅读 134

收藏
2022-03-14

共1个答案

小编典典

Placement new 允许您在已分配的内存中构造一个对象。

当您需要构造一个对象的多个实例时,您可能希望这样做以进行优化,并且每次需要新实例时不重新分配内存会更快。相反,对可以容纳多个对象的内存块执行单个分配可能会更有效,即使您不想一次使用所有对象。

DevX 给出了一个很好的例子

标准 C++ 还支持放置 new
运算符,它在预分配的缓冲区上构造一个对象。这在构建内存池、垃圾收集器或仅在性能和异常安全至关重要时非常有用(由于内存已经分配,​​因此没有分配失败的危险,并且在预分配的缓冲区上构建对象需要更少的时间)

char *buf  = new char[sizeof(string)]; // pre-allocated buffer
string *p = new (buf) string("hi");    // placement new
string *q = new string("hi");          // ordinary heap allocation

您可能还想确保关键代码的某个部分不会出现分配失败(例如,在起搏器执行的代码中)。在这种情况下,您可能希望更早地分配内存,然后在临界区中使用新位置。

重新分配安置新

您不应该取消分配正在使用内存缓冲区的每个对象。相反,您应该只删除 [] 原始缓冲区。然后,您必须手动调用类的析构函数。有关这方面的好建议,请参阅
Stroustrup的常见问题解答:是否存在“展示位置删除”

2022-03-14