这里有人用过C++的“placement new”吗?如果是这样,那又是为了什么?在我看来,它只对内存映射硬件有用。
Placement new 允许您在已分配的内存中构造一个对象。
当您需要构造对象的多个实例时,您可能希望这样做以进行优化,并且每次需要新实例时不重新分配内存会更快。相反,对可以容纳多个对象的内存块执行一次分配可能会更有效,即使您不想一次使用所有内存块。
DevX 给出了好例子 http://www.devx.com/tips/Tip/12582:
标准 C++ 也支持放置
new 运算符,它构造一个
预分配缓冲区上的对象。这
在构建内存池时很有用,
垃圾收集器或者只是当
性能和异常安全是
最重要的(没有危险
由于内存分配失败
已经被分配了,并且
在 a 上构造一个对象
预分配的缓冲区需要更少的时间):
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 的常见问题解答:是否有“展示位置删除” http://www.stroustrup.com/bs_faq2.html#placement-delete?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)