从浮点数组获取字节而不进行分配(即通过强制转换)

问题描述 投票:-1回答:2

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

对我来说,使用Buffer.BlockCopy或类似方法将其转换为字节[]并不是问题。但是由于内存碎片,定期分配此大小的数组会失败,因此,如果可能,我希望避免复制它。

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

c# unsafe
2个回答
0
投票

如果我正确理解了您的问题,类似这样:

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

0
投票

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

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

无法使两个托管阵列共享相同的内存。

如果您需要使用C#中的[]byte[]这两个API,则无法使它们共享内存。如果其中一个API采用较低级别的内容(例如float[]),则可能有一种方法,但是C#中的数组是完整的对象,它唯一要做的就是分配自己的内存。

© www.soinside.com 2019 - 2024. All rights reserved.