上就是代码的解析,相信很多人疑惑的地方就是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, Vector128int.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 Vector128int.Count; i) { if (value result[i]) { value result[i]; } }