reinterpret_cast 风格行为
如果您有点操纵,那么这将非常有用
许多高性能哈希码实现使用 UInt32 作为哈希值(这使得转换更简单)。由于 .Net 需要 Int32 用于您想要快速将 uint 转换为 int 的方法。由于实际值是什么并不重要,因此只需保留值中的所有位,就需要重新解释强制转换。
public static unsafe int UInt32ToInt32Bits(uint x)
{
return *((int*)(void*)&x);
}
请注意,命名是基于BitConverter.DoubleToInt64Bits
继续散列,将基于堆栈的结构转换为 byte* 可以轻松使用每字节散列函数:
// from the Jenkins one at a time hash function
private static unsafe void Hash(byte* data, int len, ref uint hash)
{
for (int i = 0; i < len; i++)
{
hash += data[i];
hash += (hash << 10);
hash ^= (hash >> 6);
}
}
public unsafe static void HashCombine(ref uint sofar, long data)
{
byte* dataBytes = (byte*)(void*)&data;
AddToHash(dataBytes, sizeof(long), ref sofar);
}
unsafe 也(从 2.0 开始)允许您使用 stackalloc。这在需要一些小的可变长度数组(如临时空间)的高性能情况下非常有用。
所有这些用途都将坚定地处于“仅当您的应用程序确实需要性能时”,因此在一般用途中是不合适的,但有时您确实需要它。
当您希望与采用 c 样式数组或字符串的一些有用的非托管函数(有很多)进行互操作时,fixed 是必需的。因此,这不仅是出于性能原因,也是出于互操作场景中的正确性原因。