Est passé par valeur raisonnable par défaut en C++11?

Traditionnelle C++, en passant par valeur dans les fonctions et les méthodes est lent pour des objets de grande taille, et est généralement mal vu. Au lieu de cela, les programmeurs en C++ ont tendance à passer des références, ce qui est plus rapide, mais qui présente toutes sortes de questions complexes autour de la propriété et plus particulièrement autour de la gestion de la mémoire (dans le cas où l'objet est alloué par tas)

Maintenant, en C++11, nous avons des références Rvalue et des constructeurs de déplacement, ce qui signifie qu'il est possible de mettre en œuvre un objet de grande taille (comme un std::vector) ce n'est pas cher pour passer par valeur dans et hors d'une fonction.

Donc, est-ce à dire que la valeur par défaut doit être de passer par valeur pour les instances de types tels que std::vector et std::string? Ce sujet pour les objets personnalisés? Quelle est la meilleure pratique?

  • pass by reference ... which introduces all sorts of complicated questions around ownership and especially around memory management (in the event that the object is heap-allocated). Je ne comprends pas comment c'est compliqué ou difficile pour la propriété? Peut-être que j'ai manqué quelque chose ?
  • Un exemple tiré de l'expérience personnelle. Un thread a un objet de type string. Il est transmis à une fonction qui génère un autre thread, mais inconnu à l'appelant la fonction a pris la chaîne comme const std::string& et non une copie. Le premier thread puis quitté...
  • Qui sonne comme une fonction clairement jamais conçu pour être appelée comme une fonction de thread.
  • D'accord avec iammilind, je ne vois pas de problème. En passant par la const de référence par défaut pour les "gros" objets, et par la valeur pour les plus petits objets. Je l'avais mis de la limite entre les grands et les petits à autour de 16 octets (ou 4 pointeurs sur un système 32 bits).
  • Herb Sutter est Retour à l'essentiel! Essentials of Modern C++ présentation à CppCon suis allé dans pas mal de détail sur cette. Vidéo.
  • Connexes: Comment passer des objets à des fonctions en C++?

InformationsquelleAutor Derek Thurn | 2011-09-29