Avatar ·

Qu'est-ce que la sémantique de déplacement (move semantics) en C++11 et pourquoi est-elle nécessaire ?

Bonjour ! Je viens de commencer à étudier C++11 et je suis tombé sur le terme « move semantics ». J'ai l'impression de comprendre que cela a un lien avec la performance, mais en pratique, je n'arrive pas à m'y retrouver. Supposons que j'ai une classe comme celle-ci : ```cpp class MyString { public: MyString(const char* str) : data_(new char[strlen(str) + 1]) { strcpy(data_, str); } ~MyString() { delete[] data_; } MyString(const MyString& other) : data_(new char[strlen(other.data_) + 1]) { strcpy(data_, other.data_); } char* data_; }; ``` J'écris une fonction qui retourne `MyString` : ```cpp MyString createHello() { MyString s("Hello, World!"); return s; // Que se passe-t-il ici ? Une copie ? } ``` En utilisant l'ancien C++03, lors du retour de la fonction, le constructeur de copie était appelé, ce qui allouait une nouvelle mémoire et copiait les données. C'est coûteux. Mais j'ai entendu dire qu'en C++11, on peut en quelque sorte « déplacer » les données pour éviter la copie. Comment cela fonctionne-t-il ? Que sont les rvalue references et std::move ? Quand les utiliser ?