首页 > 解决方案 > 从浮点数组中获取字节而不进行分配(即通过强制转换)

问题描述

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

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

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

标签: c#unsafe

解决方案


如果我正确理解了您的问题,则如下所示:

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

推荐阅读