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?

Était-ce utile?

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).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top