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

            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;

 }
};

最佳答案

new(pointer) Type(arguments);

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

然后这个 Type* 被取消引用以给出一个 Type&

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

关于c++ - 关于TBB/C++代码的问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2746627/

10-10 22:21