C#的对象类型分为两种:值类型与引用类型
两种打印地址的方式不一样
值类型:
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,对同一个对象进行两次地址的打印,发现是不一样的(具体为什么运行过程中GC内存地址进行移位了,暂时也不太清楚,得去深挖Mono的GC机制才行)。
另外,也不要对值类型使用PrintReferenceTypeObjectAddress的方式来打印地址,它会进行装箱操作(值类型封装成object),导致每次地址不一样。