4

スレッドビルディングブロックの本を読んでいます。このコードがわかりません:

            FibTask& a=*new(allocate_child()) FibTask(n-1,&x);
FibTask& b=*new(allocate_child()) FibTask(n-2,&y);

これらの指令は何を意味するのでしょうか? クラスオブジェクト参照と新しい作業は一緒ですか? 説明ありがとう。

次のコードは、このクラス FibTask の定義です。

class FibTask: public task

{
public:

 const long n;
    long* const sum;
 FibTask(long n_,long* sum_):n(n_),sum(sum_)
 {}
 task* execute()
 {
  if(n<CutOff)
  {
   *sum=SFib(n);
  }
  else
  {
   long x,y;

   FibTask& a=*new(allocate_child()) FibTask(n-1,&x);
   FibTask& b=*new(allocate_child()) FibTask(n-2,&y);
   set_ref_count(3);
   spawn(b);
   spawn_and_wait_for_all(a);
   *sum=x+y;
  }
  return 0;

 }
};
4

2 に答える 2

5
new(pointer) Type(arguments);

この構文はplacement newpointerと呼ばれ、場所がすでに割り当てられていると仮定し、その場所で のコンストラクターTypeが単に呼び出され、Type*値を返します。

次に、これType*を逆参照して を与えますType&

Placement new は、現在読んでいるコード ( ) に示されているように、カスタム割り当てアルゴリズムを使用する場合に使用されますallocate_child()

于 2010-04-30T18:11:57.903 に答える
4

コード

   FibTask& a=*new(allocate_child()) FibTask(n-1,&x);
   FibTask& b=*new(allocate_child()) FibTask(n-2,&y);

このタスクの 2 つのサブタスクを作成し、作成したタスクの後続タスクとしてこのタスクを設定します。これらのタスクを割り当てるために使用されるスペースは、配置として thsi->allocate_child() が使用される場合、このタスクによって管理されます。利点は、これらのサブタスクがこのタスクによって所有され、現在のタスクが自動的に解放されるときに解放されることです。これは、現在のタスクがサブタスクに依存しているため、サブタスクの寿命が尽きるために実行できることに注意してください。

これは、次のようにも記述できます。

   FibTask* a=new(allocate_child()) FibTask(n-1,&x);
   FibTask* b=new(allocate_child()) FibTask(n-2,&y);
   set_ref_count(3);
   spawn(*b);
   spawn_and_wait_for_all(*a);

ポインターの代わりに参照を使用すると、このコードを維持する人々は、ポインターを削除する必要があるとは思わなくなります。まあ、これが私が見つけた説明です。

于 2010-04-30T19:00:19.830 に答える