我刚刚学习了名为"placement new"的C++结构.它允许您精确控制指针指向内存的位置.它看起来像这样:
#include// Must #include this to use "placement new" #include "Fred.h" // Declaration of class Fred void someCode() { char memory[sizeof(Fred)]; void* place = memory; Fred* f = new(place) Fred(); // Create a pointer to a Fred(), // stored at "place" // The pointers f and place will be equal ... }
(来自C++ FAQ Lite的
例子)在这个例子中,this
Fred 的指针将等于place
.
我已经看到它在我们团队的代码中使用过一次或两次.根据您的经验,这个构造能够实现什么?其他指针语言是否有类似的结构?对我来说,它似乎让人联想equivalence
到FORTRAN,它允许不同的变量占据内存中的相同位置.
它允许您进行自己的内存管理.通常情况下,这会让你的性能略有提升,但有时这是一个很大的胜利.例如,如果您的程序使用大量标准大小的对象,您可能希望创建一个具有一个大内存分配的池.
这种事情也在C中完成,但由于C中没有构造函数,因此不需要任何语言支持.
它还用于嵌入式编程,其中IO设备通常映射到特定的存储器地址
我在共享内存段中构造对象时使用过它.
在构建像对象一样的容器时,它非常有用.
例如,如果您要创建矢量.如果为大量对象保留空间,则需要使用一些不调用对象构造函数的方法来分配内存(如new char [sizeof(object)*reserveSize]).然后,当人们开始将对象添加到向量中时,您可以使用placement new将它们复制到已分配的内存中.
templateclass SillyVectorExample { public: SillyVectorExample() :reserved(10) ,size(0) ,data(new char[sizeof(T) * reserved]) {} void push_back(T const& object) { if (size >= reserved) { // Do Somthing. } // Place a copy of the object into the data store. new (data+(sizeof(T)*size)) T(object); ++size; } // Add other methods to make sure data is copied and dealllocated correctly. private: size_t reserved; size_t size; char* data; };
PS.我不是在鼓吹这样做.这只是容器如何工作的简化示例.
Placement new可用于创建类型安全的联合,例如Boost variant
.
union类包含一个缓冲区,它与指定包含的最大类型(并且具有足够的对齐)一样大.它new
根据需要将对象放入缓冲区.