Я пытаюсь ускорить программу, используя 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 создает копии аргументов, даже если они должны быть переданы ссылкой const? Могу ли я это избежать? В моем наивном разуме, должен быть только указатель, передаваемый различным вызовам функции (которая только читает из памяти в любом случае.) Я использую gcc-4.6.3 для Linux, если это имеет значение.