swap idiom - C++ - Programmation
Marsh Posté le 07-11-2009 à 16:54:31
quand tu swap pour affecter, tu laisse au systeme la charge de creer la nouvelle mémoire, copier et liberer l'ancienne. C'ets beaucoup plus simple à ecrire, ca evite l'horrible if(this !=asource) et ca a une strong guarantee sur les exceptions.
Code :
|
ca a l'air mieux que la vielle forme et ca evite la duplication de code du copy-ctor
Marsh Posté le 07-11-2009 à 18:04:06
pourtant ici on se retrouve bien à faire de l'auto affectation si ça se produit :
template<class T>
void swap (T &a, T &b)
{
T temp (a);
a = b;
b = temp;
}
Marsh Posté le 07-11-2009 à 18:09:05
et d'ailleurs quel est le pbm posé par l'auto-affect ?
(2 questions donc au final)
Marsh Posté le 07-11-2009 à 18:12:05
C'est bien sûr à ne pas faire si on n'a pas un swap spécialisé pour la classe (soit une spécialisation de std::swap, soit une version dans le namespace de la classe).
L'idée derrière le passage par valeur de A -- idiome qu'on ne voit que depuis relativement peu de temps -- est de profiter de la possibilité d'élision du constructeur de copie quand on passe un temporaire.
Marsh Posté le 07-11-2009 à 18:32:01
Glock 17Pro a écrit : pourtant ici on se retrouve bien à faire de l'auto affectation si ça se produit : |
Non ton swap il ets spécialisé pour ta classe et va swapper ses membre :E
l'auto affect c'ets la crap quand tu detruit l'ancien avant d'y copier le nouveau
Marsh Posté le 07-11-2009 à 18:44:38
|
tout à fait. Rien à rajouter à ça.
l'auto affect c'ets la crap quand tu detruit l'ancien avant d'y copier le nouveau :o |
idem
|
Pourquoi swapper et ne pas se contenter de faire this->membre1 = obj.membre1;
Code :
|
Marsh Posté le 07-11-2009 à 18:47:41
il faut swapper pour que le veil objet soit detruit automagiquement quand la copie sort de scope.
Marsh Posté le 07-11-2009 à 18:56:26
merde je vois pas ce que tu veux dire là on a donc
Code :
|
et
Code :
|
à quel endroit ça ne serait pas auto destruct si pas de swap ?
Marsh Posté le 07-11-2009 à 19:01:43
Bon, je vais te sortir l'exempel que je file à mes étudiants de première année ...
la bonne vieille classe array<T>
Code :
|
L'idée est de swap le contenu du lhs de op= avec le rhs temporaire.
Comme ça, à la sortie de )=, le lhs contient le rhs (affectation) et le rhs contient le lhs. Comme le rhs sort de scope, il est détruit, libérant les ressources de l'ancienne instance
Marsh Posté le 08-11-2009 à 17:11:44
ah yes j'ai enfin capté, ty.
tu le mets pas dans le std, le swap spécialisé ? c'est inutile ?
Marsh Posté le 08-11-2009 à 19:12:03
normalement, t'as pas le droit d'ouvrir std pour y foutre des specialisations.
Si tu le mets dans le namespace de ta classe, le Koenig's Lookup va le trouver tout seul.
Marsh Posté le 08-11-2009 à 19:44:13
D'après la norme (le dernier draft a une formulation très légèrement différente):
Citation : It is undefined for a C++ program to add declarations or definitions to namespace std unless otherwise specified. A program may add template specializations for any standard library template to namespace std. Such specilization (complete or partial) of a standard library template results in undefined behavior unless the declaration depends on a user-defined name of external linkage and unless the specialization meets the standard library requirements for the original template. |
Mais attention le swap de Joel n'est pas une specialisation mais une surcharge.
Voir http://www.open-std.org/jtc1/sc22/ [...] /n1296.asc
Marsh Posté le 09-11-2009 à 13:01:47
ok , donc un code commme :
Code :
|
et tout à fait valide , so
Marsh Posté le 07-11-2009 à 15:11:39
Quel est l'intérêt de cet idiom, j'ai jamais eu à faire du swap dans mes applis finalement, pourquoi est ce qu'on retrouve ça ici et là ?
pourquoi dans l'operateur dassignement ?
dans l'operateur = on veut pas swaper, on veut affecter....
---------------
.