C#ナレッジシリーズ:オブジェクトのメモリアドレスを取得する

C#オブジェクトタイプは、値タイプと参照タイプの2つのタイプに分けられます。

住所を印刷する2つの方法は異なります

値のタイプ:

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

 

参照型:

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

        参照型でGCHandleTypeにGCHandleType.Pinnedを使用する必要があるのはなぜですか(インターネット上の多くのブログでは説明されておらず、他の型を使用しているものもあります)、「C#ナレッジシリーズ:GCHandleTypeの役割」を順番に参照できます。GCオブジェクトがシフトするのを防ぐために、別のGCHandleTypeを使用して同じオブジェクトのアドレスを2回出力すると、同じではないことがわかります(具体的には、実行中のプロセス中にGCメモリアドレスがシフトされる理由は、とりあえず、Mono GCメカニズムの動作をさらに深く掘り下げる必要があります)。

        また、PrintReferenceTypeObjectAddressメソッドを使用して値型のアドレスを出力しないでください。ボックス化操作(値型がオブジェクトにカプセル化される)が実行されるため、アドレスは毎回異なります。

おすすめ

転載: blog.csdn.net/qq1090504117/article/details/111676719