2

最近我读了一段这样的代码:

template <unsigned long size>
class FooBase
{
  bool m_bValid;
  char m_data[size];
};

template <class T>
class Foo : public FooBase<sizeof(T)>
{
  // it's constructor
  Foo(){};
  Foo(T const & t) {construct(t); m_bValid = (true);}

  T const * const GetT() const { return reinterpret_cast<T const * const>(m_data); }
  T * const GetT() { return reinterpret_cast<T * const>(m_data);}

  // could anyone help me understand this line??
  void construct(T const & t) {new (GetT()) T(t);}
};

我已经对代码进行了切片以确保它没有那么复杂,主要问题是关于construct(T const & t)函数的。

究竟是new (GetT()) T(t);什么意思?

顺便说一句,GetT()调用哪个版本?

4

3 回答 3

5

究竟是new (GetT()) T(t);什么意思?

它是Placement new,它允许您将对象放置在内存中的特定位置,该位置由Get().

哪个版本GetT()被称为?

第二个。
每当编译器可以在 const 和非常量函数之间进行选择时,它都会选择非常量版本。
具体来说,在这种情况下,正如@James 在评论中指出的那样:
优先考虑非常量版本,因为调用它的成员函数是非常量的。

于 2012-10-04T08:05:36.907 回答
2

这就是所谓的“安置新”。

这意味着您在给定的内存缓冲区上创建一个新对象。

new (buffer) T(); //means it will instantiate an object T in the buffer.

这允许您拥有内存缓冲区和自定义分配器,而无需从操作系统请求和分配新内存。

阅读本文: “安置新”有什么用途?

于 2012-10-04T08:08:51.897 回答
1

这看起来像是一个展示位置新调用。这里没有分配内存。new 简单地返回括号中的地址并调用虚拟构造对象的构造函数。

于 2012-10-04T08:05:43.360 回答