Warum kopiert std :: async seine const & Argumente?

Ich versuche, ein Programm mit std :: async zu beschleunigen. Nehmen wir an, ich habe eine Funktion

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

Wobei T ein Typ ist, dessen Kopieren teuer ist. Ich habe mehrere unabhängige Aufrufe von f mit unterschiedlichen Argumenten und versuche, sie ungefähr so ​​mit std :: async zu parallelisieren: (wobei m_futures ein std :: -Vektor von Futures des richtigen Typs ist).

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

Ich habe festgestellt, dass der obige Code die Ausführung meines Programms verlangsamt. Ich habe es mit gdb durchlaufen und wenn die Zukunft erstellt ist, wird der Kopierkonstruktor von T dreimal aufgerufen. Warum das? Die Argumente a, b, c sind Heap zugeordnet, aber vielleicht weiß der Compiler nichts davon? Kann ich es irgendwie explizit machen?

Ist es immer so, dass std :: async Kopien der Argumente erstellt, auch wenn diese per const-Referenz übergeben werden sollten? Kann ich das irgendwie vermeiden? Meiner Meinung nach sollte es nur einen Zeiger geben, der auf die verschiedenen Aufrufe der Funktion verweist (die sowieso nur aus dem Speicher liest). Ich verwende gcc-4.6.3 unter Linux, wenn das wichtig ist.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage