2010-04-30 80 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