看起来,placement new在预先分配的内存上创建了一个新对象,所以这是否意味着它会花费更少的时间?看起来它比使用旧的普通new分配更快。那么,如果这样做既方便又快捷,为什么不一直使用placement new呢?
发布于 2012-02-08 05:55:06
正常(非放置) new基本上等同于
T* ptr = static_cast<T*>(malloc(sizeof(T)));
new(ptr) T;当然,由于错误检查之类的原因,实际情况看起来有点不同,但结果或多或少是相同的(通过不完全相同,您不能销毁以这种方式分配的指针,而是需要显式地调用析构函数(ptr->~T()),然后使用free释放内存)。
因此,放置new确实应该比不放置new更快,因为它不需要分配内存。然而,问题是内存需要分配到某个地方。因此,您实际上已经将一个对new的调用替换为一个对placement new的调用和一些用于分配的代码(如果不是这样的话,为什么要首先使用new呢?)很明显,这不太方便,而且更容易出现bug。
当然,现在您可以编写一个更快的分配方法,但为了实现这一点,您通常需要做一些权衡。如果不使用更多的内存(额外的数据用于更快地识别空闲块)或使其非常具体(编写单个对象大小的快速分配比一般的分配容易得多),那么编写一个更快的分配器将不是一件容易的事情。最后,这通常是不值得的(对于scenarious,它可能已经完成的努力是值得的,所以你可以使用现有的分配器(它可能在内部使用placement new ))。
当然,放置new也有用法(有时您确实预先分配了内存),但这种情况并不常见
发布于 2012-02-08 05:28:53
对于大多数程序来说,这是不必要的,因为它们的使用模式不需要它。对于不经常使用堆的程序来说,这没有什么区别,而且很难正确使用(也就是说,比你的操作系统更好)。同样,你也只能通过优化你的分配来获得这么多。在大多数情况下,任何算法优化都将导致更大的整体加速。定制分配器可以提供的许多保证(通过预分配内存保证分配的时间限制,低内存碎片)通常是不需要的。
确实有一些程序可以从自己的内存管理中获益,只是它们很难识别。在您发现内存分配实际上是一个瓶颈之后,就更难找到更好的分配方案了。当所有这些都做完了,通常还是不值得这么麻烦。
发布于 2012-02-08 05:26:21
放置new的目的之一是使用自定义分配器来创建新对象,并调用它们的构造函数。它并不总是更快,因为它只和你的自定义分配器一样快。
https://stackoverflow.com/questions/9184173
复制相似问题