我正在阅读线程构建块书。我不明白这段代码:
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;
}
};
答案 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);
使用引用而不是指针会强制维护此代码的人不要认为必须删除指针,这就是我发现的解释。