C ++ 11 wprowadza semantykę przenoszenia, która może na przykład poprawić wydajność kodu w sytuacjach, w których C ++ 03 musiałby wykonać konstrukcję kopii lub przypisanie kopii. W tym artykule opisano, że następujący kod przyspiesza 5-krotnie po skompilowaniu z C + 11:
vector<vector<int> > V;
for(int k = 0; k < 100000; ++k) {
vector<int> x(1000);
V.push_back(x);
}
Jaki jest wpływ semantyki ruchów w C ++ 11 w kontekście obliczeń naukowych?
Interesuje mnie to pytanie ogólne, ale dokładniej interesuje mnie również semantyka przenoszenia dla kodów elementów skończonych napisanych przy użyciu bibliotek doładowań. Przetestowałem część własnego kodu C ++ 03 przy użyciu wersji boost 1.47.0 (ponieważ informacje o wydaniu boost wspominają, że semantyka move została wprowadzona w wersji 1.48.0) i wersji boost 1.53.0, ale nie zauważyłem dużej poprawy. Wydaje mi się, że wszelkie oszczędności wynikające z konieczności wykonywania kopiowania dla boost::numeric::ublas::vector
/ matrix
i boost::function
nie są zauważalne, ponieważ rozwiązywanie macierzy systemowych stanowi większość obciążenia.
Edycja: W rzeczywistości wygląda na to, że semantyka przenoszenia jest zaimplementowana tylko dla boost::function
(patrz informacje o wersji 1.52.0 ). Nie ma wzmianki o semantyce przenoszenia w boost::numeric
, przeszukałem źródła, aby się upewnić i wydaje się, że nie ma odniesień do wartości.