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()が呼び出されますか?

2つ目。
コンパイラーが const 関数と非 const 関数のどちらかを選択するオプションを持っている場合は常に、非 const バージョンを選択します。
具体的には、この場合、@James がコメントで指摘しているように、
それを呼び出すメンバー関数が非 const であるため、非 const バージョンが優先されます。

于 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 に答える