¿Por qué std :: async copia sus const y argumentos?

Estoy tratando de acelerar un programa usando std :: async. Digamos que tengo una función

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

Donde T es un tipo que es caro copiar. Tengo varias llamadas independientes de f con diferentes argumentos y trato de ponerlas en paralelo con std :: async aproximadamente así: (donde m_futures es un std :: vector de futuros del tipo correcto).

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

Observé que el código anterior ralentiza la ejecución de mi programa. Lo atravesé con gdb y cuando se crea el futuro, el constructor de copia de T se llama tres veces. ¿Porqué es eso? Los argumentos a, b, c están asignados a un montón, pero tal vez el compilador no lo sepa. ¿Puedo hacerlo explícito de alguna manera?

¿Es siempre el caso que std :: async crea copias de los argumentos, incluso si se deben pasar por referencia constante? ¿Puedo evitar esto de alguna manera? En mi ingenuidad, solo debería pasar un puntero a las diferentes invocaciones de la función (que de todos modos solo se lee de la memoria). Estoy usando gcc-4.6.3 en Linux si eso importa.

Respuestas a la pregunta(1)

Su respuesta a la pregunta