« Les opérations bit à bit/Les subtilités du XOR » : différence entre les versions
Contenu supprimé Contenu ajouté
Ligne 19 :
Pour résumer : MOV Ra -> Rb <=> Ra XOR 0 -> Rb
==
La propriété <math>a \oplus a = 0</math> est aussi utilisée pour créer des listes doublement chainées plus économes en mémoire que la normale, appelées '''listes liées par ou exclusif''', ou encore ''listes à chaînage XOR''.
Une liste doublement chainée normale stocke deux pointeurs : un vers le nœud suivant
[[File:XorLinked1.png|centre|vignette|upright=2.0|Liste doublement chainée normale.]]
Les listes liées par ou exclusif (''XOR linked lists'')
[[File:XORlinked2.png|centre|vignette|upright=2.0|Liste chainée XOR.]]
===Parcourir une liste liée par ou exclusif===
Ligne 75 :
Le premier inconvénient est le fait que l'on doive parcourir la liste à chaînage XOR du début à la fin. Impossible de revenir en arrière pendant le parcours de la liste chaînée, à moins d'utiliser une variable supplémentaire. Certes, revenir en arrière de cette manière est assez rare, mais cela peut avoir son utilité.
Enfin, de telles listes marchent assez mal avec les algorithmes de ramasse-miettes (''garbage collection''). Avec l'usage d'un ramasse-miette, la libération de la mémoire inutilisée est automatique. Les algorithmes de libération de la mémoire inutilisée se basent cependant sur l'usage de pointeurs. Pour être précis, ils analysent les données accessibles via les pointeurs d'un programmes pour déterminer la mémoire utile de la mémoire libre. Si les pointeurs sont cachées, comme dans les listes à chaînage XOR, les algorithmes ne peuvent pas les reconnaître et donnent un résultat sous-optimal. La libération de la mémoire se fait moins bien, ce qui peut poser quelques problèmes. Ironiquement, cela peut augmenter la consommation mémoire alors que le but du chaînage XOR est justement de la réduire. Cependant les langages à ramasse-miette n'autorisent pas les pointeurs, car le langage les gère. Il n'est donc pas possible d'implémenter de telles listes dans ces langages. Par contre, le problème peut se poser si un ramasse-miette est utilisé dans un langage qui n'en utilise pas nativement. En effet, il existe des librairies qui permettent d'ajouter un ramasse-miette dans des programmes codés en C ou en C++, un bon exemple étant le ''Boehm garbage collector''. L'usage d'une liste à chaînage XOR avec de telles librairies peut éventuellement poser quelques problèmes.
Ces inconvénients sont à comparer avec les avantages promis pour cette structure de données. L'avantage principal d'une liste à chaînage XOR est évidemment la consommation de mémoire
{{NavChapitre | book=Les opérations bit à bit
|