关于TBB / C ++代码的问题

时间:2010-04-30 18:05:01

标签: c++ tbb

我正在阅读线程构建块书。我不明白这段代码:

            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;

 }
};

2 个答案:

答案 0 :(得分:4)

new(pointer) Type(arguments);

此语法称为placement new,它假定已分配位置pointer,然后只在该位置调用Type的构造函数,并返回Type*值。

然后取消引用此Type*以提供Type&

当您要使用自定义分配算法时,会使用Placement new,如您正在阅读的代码(allocate_child())中所示。

答案 1 :(得分:4)

代码

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

创建此任务的两个子任务,并将此任务设置为已创建任务的后继任务。当ss&gt; 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);

使用引用而不是指针会强制维护此代码的人不要认为必须删除指针,这就是我发现的解释。