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