Por que o std :: async copia seus constantes e argumentos?

Eu estou tentando acelerar um programa usando std :: async. Vamos dizer que eu tenho uma função

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

Onde T é um tipo que é caro para copiar. Eu tenho várias chamadas independentes de f com diferentes argumentos e eu tento paralelizá-los com std :: async aproximadamente assim: (onde m_futures é um std :: vetor de futuros do tipo correto).

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

Eu observei que o código acima atrasa a execução do meu programa. Eu passei por ele com gdb e quando o futuro é criado, o construtor de cópia de T é chamado três vezes. Por que é que? Os argumentos a, b, c são heap alocados, mas talvez o compilador não saiba sobre isso? Posso explicá-lo de alguma forma?

É sempre o caso que std :: async cria cópias dos argumentos, mesmo se eles devem ser passados ​​por referência const? Posso evitar isso de alguma forma? Na minha mente ingênua, deve haver apenas um ponteiro passado para as invocações diferentes da função (que só lê a partir da memória de qualquer maneira). Eu estou usando o gcc-4.6.3 no Linux se isso é importante.

questionAnswers(1)

yourAnswerToTheQuestion