Dlaczego std :: async kopiuje swoją stałą i argumenty?

Próbuję przyspieszyć program, używając std :: async. Powiedzmy, że mam funkcję

T* f (const T& t1, const T& t2, const T& t3)

Gdzie T jest typem drogim do skopiowania. Mam kilka niezależnych wywołań f z różnymi argumentami i próbuję je zrównoważyć z std :: async mniej więcej tak: (gdzie m_futures jest std :: vector przyszłości odpowiedniego typu).

for (...) {
   m_futures.push_back (
       std::async(
           std::launch::async,
           f,
           a,b,c));
}

Zauważyłem, że powyższy kod spowalnia wykonywanie mojego programu. Przeszedłem przez gdb, a kiedy tworzona jest przyszłość, konstruktor kopii T jest wywoływany trzy razy. Dlaczego? Argumenty a, b, c są przydzielane sterty, ale może kompilator o tym nie wie? Czy mogę jakoś to wyjaśnić?

Czy zawsze jest tak, że std :: async tworzy kopie argumentów, nawet jeśli powinny być przekazywane przez referencję const? Czy mogę jakoś tego uniknąć? W moim naiwnym umyśle powinien istnieć wskaźnik przekazywany do różnych wywołań funkcji (która i tak czyta z pamięci.) Używam gcc-4.6.3 w Linuksie, jeśli to ma znaczenie.

questionAnswers(1)

yourAnswerToTheQuestion