对象放置(参见TC ++ PL第3版10.4.11)

时间:2012-01-18 05:07:25

标签: c++

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以及它在这里做了什么? 广泛解释.....

2 个答案:

答案 0 :(得分:2)

您可以通过两种方式致电operator new。我假设你熟悉的第一种方式:

X *p1 = new X;

有了这种用法,你告诉编译器要做两件事:

  1. 分配足够的空间来存储X的实例。这是通过调用标准运行时提供的默认分配器来完成的,除非您全局重载operator new以执行不同的操作。
  2. 填写X的数据成员,并通过调用X的构造函数之一将其置于已知的初始状态。
  3. 现在代码中显示了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 *'指针。