Comment fonctionne object.gethashcode lorsque le GC déplace un objet?
Question
Si je comprends correctement, dans .net l'implémentation par défaut de Object.GetHashCode()
Renvoie une valeur basée sur l'adresse mémoire d'un objet (au moins pour les types de référence). Cependant, le collecteur des ordures est libre de déplacer des objets en mémoire. Vraisemblablement, le code de hachage ne change pas uniquement parce que le GC déplace un objet, alors y a-t-il une manipulation spéciale pour cette interaction, ou mes hypothèses sont-elles fausses?
La solution
Il ne renvoie pas une valeur en fonction de l'adresse. Il renvoie une valeur basée sur le bloc Sync pour l'objet.
Le bloc de synchronisation est alloué la première fois object.GetHashCode
est appelé (lorsqu'il n'est pas remplacé) ou Il y a des affirmations sur la serrure pour l'objet. (Il peut être alloué si vous appelez aussi Wait / Pulse / Pulseall, je n'ai pas regardé.)
Le bloc de synchronisation est indépendant de l'emplacement des principales données de l'objet en mémoire. Fondamentalement (si je comprends bien), il existe une grande table pour les blocs de synchronisation - qui est maintenue efficace d'une certaine manière, en partie en raison de tous les objets qui n'en nécessitent pas (les seuls où le code de hash du système est requis, ou le verrouillage).