从没有分配的浮点数组中获取字节(即通过强制转换)

Get bytes from float array without allocations (i.e. via cast)

我有一个相当大的浮点数组(通常超过 4000 万个条目),它占用 150MB 到 250MB 兆字节的内存,我需要将它传递给两个不同的 API。两者都是我无法更改的第三方工具。其中一个只接受 byte[] 而另一个只接受 ref float[].

使用 Buffer.BlockCopy 或类似方法将其转换为 byte[] 对我来说不是问题。但是由于内存碎片分配这个大小的数组经常失败,我想尽可能避免复制它。

有什么办法可以做到这一点吗?也许使用不安全代码或 C++ cli 或 C++ 或它们的组合?或者也许使用 MemoryMappedFile?我已经尝试了所有这些,但到目前为止没有任何成功。

如果我对你的问题的理解正确的话,是这样的:

GCHandle handle = GCHandle.Alloc(myObject, GCHandleType.Pinned);
try
{
    IntPtr myPinnedPointer = handle.AddrOfPinnedObject();
    // use myPinnedPointer for your needs
}
finally
{
    handle.Free();
}

这个问题之前被标记为 C++/CLI。在这种情况下,byte[] 有点模棱两可,您可能指的是非托管 C 样式数组(在 C++/CLI 中使用 [] 语法),或者您可能指的是托管数组(它在 C# 中使用 [] 语法,但在 C++/CLI 中不使用。)

由于问题现在仅标记为 C#,我假设当您说 [] 时,您指的是托管数组。

无法使两个托管数组共享同一内存。

如果你需要使用的两个API在C#中是byte[]float[],那么没有办法让它们共享内存。如果其中一个 API 采用较低级别的东西,例如 byte*,可能会有一种方法,但 C# 中的数组是一个成熟的对象,它唯一想做的就是分配它的自己的记忆。