这里有人用过 C++ 的“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的常见问题解答:是否存在“展示位置删除”?