提问人:IS4 提问时间:2/28/2016 最后编辑:IS4 更新时间:2/28/2016 访问量:99
逐字节比较非装箱值类型
Compare non-boxed value type byte-by-byte
问:
.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;
}
}
答: 暂无答案
评论
Equals()
IEquatable<T>
unsafe
unsafe
byte*
unsafe
AllocHGlobal()