Série de connaissances C #: obtenir l'adresse mémoire d'un objet

Les types d'objets C # sont divisés en deux types: les types valeur et les types référence

Les deux méthodes d'impression des adresses sont différentes

Type de valeur:

unsafe void PrintValueTypeObjectAddress()
{
   Vector2 v1 = new Vector2();
   Vector2* pV1 = &v1;
   Debug.Log((int)pV1);
} 

 

Type de référence:

 public static unsafe void PrintReferenceTypeObjectAddress(object o)
{
    GCHandle h = GCHandle.Alloc(o, GCHandleType.Pinned);
    IntPtr addr = h.AddrOfPinnedObject();
    Debug.Log("0x" + addr.ToString("X"));
}

        Pourquoi avez-vous besoin d'utiliser GCHandleType.Pinned pour GCHandleType dans le type de référence (de nombreux blogs sur Internet n'expliquent pas, et certains utilisent même d'autres types), vous pouvez vous référer à "C # Knowledge Series: The Role of GCHandleType" , dans l'ordre pour empêcher les objets GC de se déplacer, si vous utilisez un autre GCHandleType pour imprimer l'adresse du même objet deux fois, vous constatez que ce n'est pas la même chose (en particulier pourquoi l'adresse mémoire du GC est décalée pendant le processus en cours, ce n'est pas clair pour le à l'heure actuelle, vous devez approfondir les travaux du mécanisme Mono GC).

        De plus, n'utilisez pas la méthode PrintReferenceTypeObjectAddress pour imprimer l'adresse du type de valeur. Elle effectuera une opération d'encapsulation (le type de valeur est encapsulé dans un objet), ce qui entraînera une différence à chaque fois de l'adresse.

Je suppose que tu aimes

Origine blog.csdn.net/qq1090504117/article/details/111676719
conseillé
Classement