逐字节比较非盒装值类型

时间:2016-02-27 19:33:58

标签: c# .net comparison unsafe

.NET中是否存在一种方法(可能是内部的),它可以比较相同类型的任何两个值的相等性,而不进行任何装箱,并且逐字节?我知道有ValueType.Equals,它会检查值类型中是否包含任何引用(依次调用ValueType.FastEqualsCheck)并逐字节地比较它们,但是你必须选中它们调用此方法的值。

我知道我可以通过FieldInfo.GetValueDirect以反射方式实现此方法,但由于反射它仍然会有点慢。

该方法应该是通用的或接受TypedReference(与大多数类似的内部方法一样)。

编辑:手动进行比较的不安全方法:

public static class ByteComparer<T> where T : struct
{
    public static readonly Func<T, T, bool> Compare;

    static ByteComparer()
    {
        var t = typeof(T);

        var dyn = new DynamicMethod("Compare", typeof(bool), new[]{t, t}, typeof(ByteComparer<T>));
        var il = dyn.GetILGenerator();

        il.DeclareLocal(t.MakeByRefType(), true);
        il.DeclareLocal(t.MakeByRefType(), true);

        il.Emit(OpCodes.Ldarga_S, 0);
        il.Emit(OpCodes.Stloc_0);
        il.Emit(OpCodes.Ldarga_S, 1);
        il.Emit(OpCodes.Stloc_1);

        il.Emit(OpCodes.Ldloc_0);
        il.Emit(OpCodes.Conv_I);
        il.Emit(OpCodes.Ldloc_1);
        il.Emit(OpCodes.Conv_I);
        il.Emit(OpCodes.Sizeof, t);

        il.EmitCall(OpCodes.Call, typeof(ByteComparer<T>).GetMethod("ByteCompare", BindingFlags.NonPublic | BindingFlags.Static), null);
        il.Emit(OpCodes.Ret);

        Compare = (Func<T,T,bool>)dyn.CreateDelegate(typeof(Func<T,T,bool>));
    }

    private static unsafe bool ByteCompare(byte* a, byte* b, int size)
    {
        for(int i = 0; i < size; i++)
        {
            if(*(a+i) != *(b+i)) return false;
        }
        return true;
    }
}

0 个答案:

没有答案