gpt4 book ai didi

c# - 在 C# 中获取指向 KeyValuePair 数组的不安全指针

转载 作者:太空狗 更新时间:2023-10-30 01:17:08 25 4
gpt4 key购买 nike

我有大量的 KeyValuePair<DateTime,decimal> .我知道在内存中数组是连续的,因为 KVP 是一个值类型,DateTime 实际上是一个 Int64,而 decimal 是一个包含 4 个整数的数组(并且不会改变)。但是,DateTime 不可 blittable,十进制也不是原始的。

是否有任何方法来滥用类型系统并获取指向数组的不安全指针并将其作为字节使用? (当这两种类型是结构的一部分时,GCHandle.Alloc 不能使用它们,但可以使用这些类型的数组。)

(如果您对原因感兴趣,我现在手动将数组转换为我认为是 1 对 1 byte[] 表示形式,而且速度很慢)

最佳答案

最后还有一个公共(public)工具:System.Runtime.CompilerServices.Unsafe package。

下面是一个通过的测试:

using System.Runtime.CompilerServices.Unsafe;
[Test]
public unsafe void CouldUseNewUnsafePackage() {
var dt = new KeyValuePair<DateTime, decimal>[2];
dt[0] = new KeyValuePair<DateTime, decimal>(DateTime.UtcNow.Date, 123.456M);
dt[1] = new KeyValuePair<DateTime, decimal>(DateTime.UtcNow.Date.AddDays(1), 789.101M);
var obj = (object)dt;
byte[] asBytes = Unsafe.As<byte[]>(obj);
//Console.WriteLine(asBytes.Length); // prints 2
fixed (byte* ptr = &asBytes[0]) {
// reading this: https://github.com/dotnet/coreclr/issues/5870
// it looks like we could fix byte[] and actually KeyValuePair<DateTime, decimal> will be fixed
// because:
// "GC does not care about the exact types, e.g. if type of local object
// reference variable is not compatible with what is actually stored in it,
// the GC will still track it fine."
for (int i = 0; i < (8 + 16) * 2; i++) {
Console.WriteLine(*(ptr + i));
}
var firstDate = *(DateTime*)ptr;
Assert.AreEqual(DateTime.UtcNow.Date, firstDate);
Console.WriteLine(firstDate);
var firstDecimal = *(decimal*)(ptr + 8);
Assert.AreEqual(123.456M, firstDecimal);
Console.WriteLine(firstDecimal);
var secondDate = *(DateTime*)(ptr + 8 + 16);
Assert.AreEqual(DateTime.UtcNow.Date.AddDays(1), secondDate);
Console.WriteLine(secondDate);
var secondDecimal = *(decimal*)(ptr + 8 + 16 + 8);
Assert.AreEqual(789.101M, secondDecimal);
Console.WriteLine(secondDecimal);
}
}

关于c# - 在 C# 中获取指向 KeyValuePair<DateTime,decimal> 数组的不安全指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32864239/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com