2010-04-30 79 views
3

我正在阅读The thread building block book。我不明白这段代码:关于TBB/C++代码的问题

  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

只是挑剔......它被称为“线程构建模块” – Nav 2011-02-11 07:38:38

回答

4
new(pointer) Type(arguments); 

这种语法称为placement new,它假定pointer已经分配的位置,那么Type构造被简单地称为该位置,并返回一个Type*值。

然后这个Type*取消提供给Type&

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

+0

特别针对TBB基于任务的编程,他们提到它为:为任务分配空间。这是通过一个特殊的“超载新”来完成的。如TBB教程pdf第11.3节所述。 – Nav 2011-02-14 11:24:38

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); 

将保持此代码不要以为指针必须删除使用引用代替指针力的人,嗯,这是我的解释找到。

+0

我认为使用指针并留下明显的(和丰富的)评论会是更好的练习。不需要调用析构函数(而不是删除)并不是显而易见的。 – 2010-04-30 21:10:10

+0

@尼尔是的,你是对的。代码是不寻常的,有点难以阅读。 – 2010-05-01 09:49:09