class X
{
public:
X (int);
// ...
};
我们可以通过提供带有额外参数的allocator函数将对象放在任何地方,然后在使用new时提供额外的参数:
void* operator new(size_t, void *p)
{
return p;
} // explicit placement operator
void* buf = reinterpret_cast<void*>(0xF00F); // significant address
X*p2 = new(buf)X; //construct an X at ‘buf;’ invokes: operator new(sizeof(X),buf)
这意味着什么?什么是reinterpret_cast以及它在这里做了什么? 广泛解释.....
答案 0 :(得分:2)
您可以通过两种方式致电operator new
。我假设你熟悉的第一种方式:
X *p1 = new X;
有了这种用法,你告诉编译器要做两件事:
operator new
以执行不同的操作。现在代码中显示了operator new
的第二种形式:
X*p2 = new(buf) X;
有了这种用法,你基本上告诉编译器不要为X分配空间。而是使用buf提供的空间来构造X的这个实例。步骤2仍然执行,但步骤1是跳过。
这里的reinterpret_cast<void *>
基本上告诉编译器在地址0xF00F处的任何内容,将其视为一些通用数据 - 没有类型或大小与此数据相关联。这相当于做一个原始的C风格的演员:
void* buf = (void*)0xF00F;
这样做是为了满足operator new的函数签名:
void* operator new(size_t, void *p)
注意通用指针void *p
- 它将采用之前传递的buf值。演员阵容是为了让他们的'类型'匹配。另请注意,0xF00F在技术上不是有效地址,但我们假装它是针对此示例的。
这就是上面的代码所做的,广义地解释。
答案 1 :(得分:1)
'reinterpret_cast'正在将指针转换为另一种指针类型。
http://msdn.microsoft.com/en-us/library/e0w9f63b.aspx
void* buf = reinterpret_cast<void*>(0xF00o0F);
0xF0000F被转换为'void *'指针。