【发布时间】:2017-04-03 11:13:23
【问题描述】:
我正在尝试使用指针比较 2 字节数组。 我将字节数组视为 int 指针以更快地运行(比较 4 个字节)。
public static bool DoBuffersEqual(byte[] first, byte[] second)
{
unsafe
{
fixed (byte* pfirst = first, psecond = second)
{
int* intfirst = (int*)pfirst;
int* intsecond = (int*)psecond;
for (int i = 0; i < first.Length / 4; i++)
{
if ((intfirst + i) != (intsecond + i))
return false;
}
}
}
return true;
}
private void Form1_Load(object sender, EventArgs e)
{
byte[] arr1 = new byte[4000];
byte[] arr2 = new byte[4000];
for (int i = 0; i < arr1.Length; i++)
{
arr1[i] = 100;
arr2[i] = 100;
}
bool res = DoBuffersEqual(arr1, arr2);
Console.WriteLine(res);
}
由于某种原因,我在调用此函数后得到 False 结果...
有人知道这里出了什么问题吗?
提前致谢!
【问题讨论】:
-
您正在比较指针,而不是指向的值。所以:
if (*(intfirst + i) != *(intsecond + i)) -
你不会取消引用你的指针,所以你比较的是指针而不是它们指向的值。
-
@spender 哎呀......你的权利......哈哈谢谢
-
您需要考虑的事情:这将非常适合
Vector<byte>和 SIMD,因此在现代 CPU 上您可以一次比较更宽的块(在我的 AVX 上 32 字节 = 256 位i7).棘手的一点是加载值 -Unsafe.Read<T>是你的朋友。另外,记得检查Vector.IsHardwareAccelerated——如果是false,不要使用它;并检查Vector<byte>.Count以检查本地特定于硬件的 SIMD 支持以了解您的步幅大小。即使您不喜欢 SIMD:您仍然可以使用long而不是int来获得操作计数。