上就是代码的解析,相信很多人疑惑的地方就是Vector128.Max做了什么,我们可以构造一个代码,让大家简单的看出来发生了什么。代码和运行结果如下所示:
/ 定义一个数组 var array = new int[] { 4, 3, 2, 1, 1, 2, 3, 4 }; // 拿到数组首地址指针 ref int current = ref MemoryMarshal.GetReference(array.AsSpan()); // 从首地址加载128位数据,上面是int32 // 所以x = 4, 3, 2, 1 var x = Vector128.LoadUnsafe(ref current); // 偏移128位以后,继续加载128位数据 // 所以y = 1, 2, 3, 4 var y = Vector128.LoadUnsafe(ref Unsafe.Add(ref current, Vector128<int>.Count)); // 使用Vector128.Max进行计算 var result = Vector128.Max(x, y); // 打印输出结果 x.Dump(); y.Dump(); result.Dump();
从运行的结果可以看到,result中保存的是x和y对应位置的最大值,这样是不是就觉得清晰明了,Stephe大佬上文的代码就是做了这样一个操作。
同样,如果我们把int32换成int64,也就是long类型,由于一个元素占用64位,所以一次只能加载2个int64元素比较最大值,得出对应位置的最大值:
最后使用下面的for循环代码,从result中找到最大的那个int32元素,从我们上文的案例中就是4,结果和代码如下所示:
var value = result[0]; for (int i = 1; i < Vector128<int>.Count; i++) { if (value < result[i]) { value = result[i]; } }