Serie de conocimientos de C #: obtener la dirección de memoria de un objeto

Los tipos de objetos de C # se dividen en dos tipos: tipos de valor y tipos de referencia

Las dos formas de imprimir direcciones son diferentes

Tipo de valor:

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

 

Tipo de referencia:

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

        ¿Por qué necesita usar GCHandleType.Pinned para GCHandleType en el tipo de referencia (muchos blogs en Internet no explican, y algunos incluso usan otros tipos), puede consultar "C # Knowledge Series: The Role of GCHandleType" , en orden para evitar que los objetos del GC se muevan, si usa otro GCHandleType para imprimir la dirección del mismo objeto dos veces, encontrará que no es el mismo (específicamente por qué la dirección de la memoria del GC se cambia durante el proceso en ejecución, no está claro para el Por el momento, debe profundizar en el funcionamiento del mecanismo Mono GC).

        Además, no utilice el método PrintReferenceTypeObjectAddress para imprimir la dirección para el tipo de valor. Este realizará una operación de encapsulado (el tipo de valor se encapsula en un objeto), lo que hace que la dirección sea diferente cada vez.

Supongo que te gusta

Origin blog.csdn.net/qq1090504117/article/details/111676719
Recomendado
Clasificación