Maison >développement back-end >C++ >Le passage par valeur devrait-il être la valeur par défaut pour les types de valeur en C 11 ?

Le passage par valeur devrait-il être la valeur par défaut pour les types de valeur en C 11 ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-05 18:13:11418parcourir

Should Pass-by-Value Be the Default for Value Types in C  11?

Pass-by-Value en C 11 : une réévaluation

En C 11, l'introduction des références rvalue et des constructeurs de déplacement a déclenché un débat : le passage par valeur devrait-il devenir la valeur par défaut pour les types valeur ?

Origines de Pass-by-Reference

Historiquement, passer des objets volumineux par valeur en C était inefficace en raison d'une copie inutile. Les paramètres de référence ont été privilégiés pour éviter une duplication coûteuse. Cependant, les références ont introduit des complexités dans la propriété et la gestion de la mémoire, en particulier pour les objets alloués au tas.

Le nouveau paradigme en C 11

Avec les références rvalue et les constructeurs de déplacement, il Il est désormais possible d'implémenter des types de valeur comme std::vector et std::string qui sont peu coûteux à transmettre par valeur. Cela soulève la question : le passage par valeur devrait-il être la nouvelle norme pour ces types ?

Recommandations

Selon Dave Abrahams, le passage par valeur est recommandé si un une copie est requise dans la fonction. Cela permet au compilateur d'optimiser la copie, comme le montre l'exemple suivant :

void foo(T t)
{
    // ...
}

Cela peut être utilisé de manière flexible pour transmettre des valeurs l, prvalues ​​ou xvalues :

T lval;
foo(lval); // copy from lvalue
foo(T {}); // (potential) move from prvalue
foo(std::move(lval)); // (potential) move from xvalue

Exceptions

Le passage par référence à const reste une option raisonnable pour certains scénarios où une copie est inutile ou indésirable. Dans de tels cas, la syntaxe suivante peut être utilisée :

class T {
    U u;
    V v;
public:
    T(U u, V v)
        : u(std::move(u))
        , v(std::move(v))
    {}
};

Conclusion

En C 11, le passage par valeur est une option intéressante pour les types valeur qui nécessitent une copie dans les fonctions. Il simplifie la gestion des paramètres et permet des opérations de déplacement efficaces. Cependant, le passage par référence à const reste une alternative appropriée dans les cas où une copie n'est pas requise.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn