Вопрос по коду TBB / C ++ - PullRequest
       11

Вопрос по коду TBB / C ++

3 голосов
/ 30 апреля 2010

Я читаю Нитку, строительный блок книги. Я не понимаю этот кусок кода:

            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 ]

4 голосов
/ 30 апреля 2010

код

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

Использование ссылок вместо указателей вынуждает людей, которые будут поддерживать этот код, не думать, что указатели должны быть удалены. Это объяснение, которое я нашел.

4 голосов
/ 30 апреля 2010
new(pointer) Type(arguments);

Этот синтаксис называется размещение нового , в котором предполагается, что местоположение pointer уже выделено, тогда конструктор Type просто вызывается в этом месте и возвращает Type* значение.

Затем этот Type* разыменовывается, чтобы получить Type&.

Placement new используется, когда вы хотите использовать собственный алгоритм размещения, как показано в коде, который вы читаете (allocate_child()).

...