Подтвердить что ты не робот

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

Я пытаюсь ускорить программу, используя 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, если это имеет значение.

4b9b3361

Ответ 1

Было бы небезопасно хранить ссылки только, так как нет ничего, чтобы гарантировать отсутствие расследований данных (и более глубоко, простое существование объектов, как сказал @utapistim в ее печально удаленном сообщении).

Если вам действительно нужна ссылка, а не копия, и вы готовы сделать ставку на то, что это правильно, тогда вы можете просто использовать ссылочную оболочку:

std::async(std::launch::async, f, std::cref(a), std::cref(b), std::cref(c))