C ++ 11 führt eine Verschiebungssemantik ein, die beispielsweise die Codeleistung in Situationen verbessern kann, in denen C ++ 03 eine Kopierkonstruktion oder eine Kopierzuweisung durchführen müsste. Dieser Artikel berichtet, dass der folgende Code beim Kompilieren mit C + 11 eine 5-fache Geschwindigkeit erfährt:
vector<vector<int> > V;
for(int k = 0; k < 100000; ++k) {
vector<int> x(1000);
V.push_back(x);
}
Welche Auswirkungen hat die C ++ 11-Bewegungssemantik im Kontext des wissenschaftlichen Rechnens?
Diese Frage interessiert mich allgemein, aber insbesondere interessiert mich auch die Verschiebungssemantik für Finite-Elemente-Codes, die mit Boost-Bibliotheken geschrieben wurden. Ich habe einen Teil meines eigenen C ++ 03-Codes mit der Boost-Version 1.47.0 (da in den Boost-Versionshinweisen erwähnt wird, dass die Verschiebungssemantik in 1.48.0 eingeführt wurde) und der Boost-Version 1.53.0 getestet, aber ich habe keine große Verbesserung festgestellt. Ich vermute, dass Einsparungen dadurch entstehen, dass für boost::numeric::ublas::vector
/ keine Kopierkonstruktion durchgeführt werden muss, matrix
und dass dies boost::function
nicht spürbar ist, da das Lösen von Systemmatrizen den größten Teil der Arbeitslast ausmacht.
Bearbeiten: Eigentlich sieht es so aus, als ob die Verschiebungssemantik nur für implementiert ist boost::function
(siehe Versionshinweise zu Version 1.52.0 ). Es gibt keine Erwähnung der Verschiebungssemantik in boost::numeric
, ich habe die Quellen überprüft, um sicherzugehen, und es scheint keine Wertreferenzen zu geben.