La commune de folklore dit que:
Le type de système existe pour une raison. Les entiers et les pointeurs sont des types distincts, casting entre eux, c'est une faute professionnelle dans la majorité des cas, peut indiquer une erreur de conception et doit être évitée.
Même lorsque cette distribution est effectuée, aucune hypothèse ne doit être faite à propos de la taille des entiers et des pointeurs (casting
void*
deint
est le moyen le plus simple pour rendre le code échouer sur x64), et au lieu deint
il faut utiliserintptr_t
ouuintptr_t
destdint.h
.
Sachant que, quand est-il réellement utile d'effectuer de telles jette?
(Remarque: le fait d'avoir un peu plus court code pour le prix de la portabilité ne compte pas comme "utiles".)
Un cas que je connais:
- Certains sans verrouillage multiprocesseur algorithmes d' exploiter le fait que 2+-octet-alligned pointeur a une certaine redondance. Ils ont ensuite utiliser la plus faible de bits de l'aiguille, en tant que booléen drapeaux, par exemple. Avec un processeur avec un jeu d'instructions, cela peut éliminer la nécessité d'un mécanisme de verrouillage (qui serait nécessaire si le pointeur et le drapeau booléen ont été séparées).
(Remarque: Cette pratique est même possible de le faire en toute sécurité en Java via java.util.de façon concomitante.atomique.AtomicMarkableReference)
Quelque chose de plus?