Sco*_*e T 13 c++ memory placement-new equivalence new-operator
我刚刚学习了名为"placement new"的C++结构.它允许您精确控制指针指向内存的位置.它看起来像这样:
#include <new> // 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
...
}
Run Code Online (Sandbox Code Playgroud)
(来自C++ FAQ Lite的
例子)在这个例子中,thisFred 的指针将等于place.
我已经看到它在我们团队的代码中使用过一次或两次.根据您的经验,这个构造能够实现什么?其他指针语言是否有类似的结构?对我来说,它似乎让人联想equivalence到FORTRAN,它允许不同的变量占据内存中的相同位置.
Dav*_*ley 15
它允许您进行自己的内存管理.通常情况下,这会让你的性能略有提升,但有时这是一个很大的胜利.例如,如果您的程序使用大量标准大小的对象,您可能希望创建一个具有一个大内存分配的池.
这种事情也在C中完成,但由于C中没有构造函数,因此不需要任何语言支持.
在构建像对象一样的容器时,它非常有用.
例如,如果您要创建矢量.如果为大量对象保留空间,则需要使用一些不调用对象构造函数的方法来分配内存(如new char [sizeof(object)*reserveSize]).然后,当人们开始将对象添加到向量中时,您可以使用placement new将它们复制到已分配的内存中.
template<typename T>
class 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;
};
Run Code Online (Sandbox Code Playgroud)
PS.我不是在鼓吹这样做.这只是容器如何工作的简化示例.
Placement new可用于创建类型安全的联合,例如Boost variant.
union类包含一个缓冲区,它与指定包含的最大类型(并且具有足够的对齐)一样大.它new根据需要将对象放入缓冲区.