JAN*_*JAN 12 c++ placement-new new-operator
看起来,placement new在预分配的内存上创建一个新对象,这是否意味着它需要更少的时间?看起来它比使用旧普通分配更快new.那么,如果这样方便快捷,为什么不一直使用placement new?
正常(非放置)new基本上相当于做
T* ptr = static_cast<T*>(malloc(sizeof(T)));
new(ptr) T;
Run Code Online (Sandbox Code Playgroud)
当然,由于错误检查等原因,现实看起来有点不同,但结果或多或少是相同的(通过不相同,你不能以delete这种方式分配指针,而是需要显式调用析构函数(ptr->~T()),然后使用 ) 释放内存free。
因此,放置新确实应该比非放置新更快,因为它不需要分配内存。但问题是内存需要分配到某个地方。因此,您基本上已经用对某处分配的new调用和一些代码替换了一次调用(如果不是,为什么您首先要使用?)。很明显,这不太方便并且更容易出现错误。placement newnew
当然,现在您可以编写更快的分配方法,但为此您通常需要进行某种权衡。如果不使用更多内存(用于更快识别空闲块的额外数据)或不使其非常具体(编写单个对象大小的快速分配比一般的分配要容易得多),那么编写一个更快的分配器并不容易。最后,这通常不值得付出努力(对于值得付出努力的场景,它可能已经完成,因此您可以使用现有的分配器(可能在内部使用新的放置))。
当然,放置 new 也有用途(有时您确实预先分配了内存),但这并不是常见情况