std::move() en C++ : ce que c'est et comment l'utiliser en 2025

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Faites connaissance : std::move() — pas ce que vous croyez

\n\n

Imaginez la situation : vous avez écrit une classe qui gère un grand tableau de données. Tout fonctionne, mais à chaque copie d'objet, des mégaoctets d'informations sont intégralement dupliqués. C'est lent et gaspilleur. Que faire ? En C++11, une solution élégante est apparue : la sémantique de déplacement et son acteur principal std::move().

\n\n

En 2025, alors que les performances et la gestion efficace de la mémoire sont plus critiques que jamais, comprendre std::move() devient une compétence obligatoire pour tout développeur C++. Mais voici le paradoxe : malgré son nom, std::move() ne déplace rien. Il rend simplement l'objet « prêt à déménager ».

\n\n

Dans cet article, nous allons voir ce que fait réellement std::move(), quand l'utiliser et quand il vaut mieux s'en abstenir. Préparez-vous — il y aura beaucoup d'exemples de code et aucune théorie ennuyeuse.

\n\n

Qu'est-ce que std::move() réellement ?

\n\n

Dissipons tout de suite le mythe principal. std::move() n'est pas une fonction qui transfère physiquement des données d'un objet à un autre. C'est un cast (conversion de type) qui transforme une lvalue en rvalue-reference.

\n\n

Voici son implémentation simplifiée (ne vous inquiétez pas, elle est simple) :

\n\n
template<typename T>\ntypename std::remove_reference<T>::type&& move(T&& arg) noexcept {\n    return static_cast<typename std::remove_reference<T>::type&&>(arg);\n}\n
\n\n

Tout ce que fait std::move(), c'est prendre votre objet et dire au compilateur : « Hé, regarde, c'est un objet temporaire, tu peux le voler ». Ensuite, ce sont les constructeurs et opérateurs d'affectation avec sémantique de déplacement qui font leur travail.

\n\n

lvalue vs rvalue : petit rappel

\n\n

Pour comprendre std::move(), il faut distinguer deux types d'expressions :

\n\n
    \n
  • lvalue (valeur gauche) — un objet qui a un nom et une adresse en mémoire. Par exemple : int x = 5; — x est une lvalue.
  • \n
  • rvalue (valeur droite) — un objet temporaire qui ne « vit » que dans l'expression courante. Par exemple : 5, le résultat d'une fonction getTemp(), ou x + 3.
  • \n
\n\n

La sémantique de déplacement fonctionne justement avec les rvalue : si un objet est temporaire, pourquoi le copier ? On peut simplement « voler » ses ressources (pointeurs, tampons, descripteurs de fichiers) et laisser l'objet d'origine dans un état « vide ».

\n\n

Quand utiliser std::move() : scénarios pratiques

\n\n

Maintenant que nous connaissons la théorie, voyons les cas réels où std::move() sera utile.

\n\n

1. Passage de gros objets aux fonctions

\n\n

Imaginez que vous ayez une classe BigData qui contient un tableau d'un million d'éléments. La passer par valeur sans déplacement est un suicide :

\n\n
#include <iostream>\n#include <vector>\n#include <string>\n\nclass BigData {\n    std::vector<int> data;\npublic:\n    BigData(size_t size) : data(size) {}\n    \n    // Constructeur de déplacement\n    BigData(BigData&& other) noexcept : data(std::move(other.data)) {\n        std::cout << "Constructeur de déplacement appelé\\n";\n    }\n    \n    // Constructeur de copie\n    BigData(const BigData& other) : data(other.data) {\n        std::cout << "Constructeur de copie appelé\\n";\n    }\n};\n\nvoid processData(BigData obj) {\n    // On travaille avec les données\n}\n\nint main() {\n    BigData big(1000000);\n    processData(std::move(big)); // Le constructeur de déplacement sera appelé\n    // Après cela, big est dans un état "vide"\n    return 0;\n}\n
\n\n

Sans std::move(), le constructeur de copie aurait été appelé avec une duplication complète du million d'éléments. Avec le déplacement, on se contente de transférer les pointeurs. La différence est des milliers de fois plus rapide.

\n\n

2. Retour d'objets lourds depuis une fon

Blogs

Book Recommendations