Próbuję przyspieszyć program przy użyciu std :: async. Załóżmy, że mam funkcję, która jest droga do skopiowania, gdzie T jest typem kosztownym. Mam kilka niezależnych wywołań f z różnymi argumentami i staram się je zrównoleglić ze std :: async mniej więcej tak: (gdzie m_futures jest std :: vector futures właściwego typu).Dlaczego std :: async kopiuje jego const & arguments?
for (...) {
m_futures.push_back (
std::async(
std::launch::async,
f,
a,b,c));
}
Zaobserwowałem, że powyższy kod spowalnia wykonywanie mojego programu. Przeszedłem przez to z gdb i kiedy tworzona jest przyszłość, konstruktor kopii T jest wywoływany trzy razy. Dlaczego? Argumenty a, b, c są przydzielane sterty, ale może kompilator o tym nie wie? Czy mogę to jakoś wyrazić?
Czy zawsze jest tak, że std :: async tworzy kopie argumentów, nawet jeśli powinny być przekazywane przez odniesienie do const? Czy mogę tego w jakiś sposób uniknąć? W moim naiwnym umyśle powinien być po prostu wskaźnik przekazany do różnych wywołań funkcji (która tak czy inaczej odczytuje z pamięci). Używam gcc-4.6.3 na Linuksie, jeśli to ma znaczenie.
Z ciekawości co się stanie, jeśli zmienię interfejs i jawnie przekazuję wskaźnik? Czy to by było równoznaczne z używaniem opakowań referencyjnych? – Thomas
@Thomas: Tak. Opakowania referencyjne * są * w zasadzie wskaźnikami. Nie używaj gołych wskaźników w C++ (z wyjątkiem prywatnych członków klasy). Wolisz opakowania referencyjne. –
OK, dzięki, nie wiedziałem o opakowaniu referencyjnym. – Thomas