一个数组反转的经典例子
int[] a = { 1, 2, 3, 4, 5, 6 };
ref int ptr = ref Unsafe.Add<int>(ref MemoryMarshal.GetArrayDataReference<int>(a), 0);
ref int ptr2 = ref Unsafe.Add<int>(ref Unsafe.Add<int>(ref ptr, a.Length), -1);
do
{
int t = ptr;
ptr = ptr2;
ptr2 = t;
ptr = ref Unsafe.Add<int>(ref ptr, 1);
ptr2 = ref Unsafe.Add<int>(ref ptr2, -1);
}
while (Unsafe.IsAddressLessThan<int>(ref ptr, ref ptr2));
通过数组在内存上是顺序排列的,通过引用地址来进行反转
MemoryMarshal.GetArrayDataReference 来获取数组第一个内存地址
Unsafe.Add 来获取一个内存地址的偏移量(由于数组是顺序排列的,下一个内存地址一定是数组下一个数据)
Unsafe.IsAddressLessThan 该值指示指定的引用是否小于另一个指定的引用。