Почему std :: async копирует свои const & аргументы?

Я пытаюсь ускорить программу с помощью std :: async. Допустим, у меня есть функция

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

Где T - это тип, который стоит копировать. У меня есть несколько независимых вызовов f с разными аргументами, и я пытаюсь распараллелить их с помощью std :: async примерно так: (где m_futures - это std :: vector фьючерсов правильного типа).

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

Я заметил, что приведенный выше код замедляет выполнение моей программы. Я прошел через это с помощью gdb, и когда создается будущее, конструктор копирования T вызывается три раза. Почему это? Аргументы a, b, c распределены в куче, но, возможно, компилятор не знает об этом? Могу ли я сделать это как-то явно?

Всегда ли так, что std :: async создает копии аргументов, даже если они должны передаваться по константной ссылке? Можно ли как-то избежать этого? По моему наивному уму, должен быть просто указатель на различные вызовы функции (которая в любом случае читает только из памяти). Я использую gcc-4.6.3 в Linux, если это имеет значение.

Ответы на вопрос(1)

Ваш ответ на вопрос