4

我正在阅读线程积木书。我不明白这段代码:

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

这些指令是什么意思?类对象引用和 new 一起工作?感谢您的解释。

下面的代码是这个类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 new,它假定位置pointer已经分配,​​然后Type在该位置上简单地调用构造函数,并返回一个Type*值。

然后Type*取消引用以给出Type&.

当您想要使用自定义分配算法时,使用新放置,如您正在阅读的代码中所示 ( 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);

创建此任务的两个子任务,并将此任务设置为已创建任务的后续任务。当 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 回答