Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从浮点数组中获取字节而不进行分配(即通过强制转换)_C#_Unsafe - Fatal编程技术网

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

C# 从浮点数组中获取字节而不进行分配(即通过强制转换),c#,unsafe,C#,Unsafe,我有一个相当大的浮点数组(通常>4000万个条目),它占用了150MB到250MB的内存,我需要将它传递给两个不同的API。这两个都是第三次聚会的工具,我不能改变。其中一个只接受字节[],另一个只接受ref float[] 使用Buffer.BlockCopy或类似方法将其转换为字节[]对我来说不是问题。但是由于内存碎片,分配这样大小的数组经常会失败,如果可能的话,我希望避免复制它 有什么办法可以做到这一点吗?可能使用不安全代码或C++ CLI或C++或它们的组合?或者使用MemoryMappe

我有一个相当大的浮点数组(通常>4000万个条目),它占用了150MB到250MB的内存,我需要将它传递给两个不同的API。这两个都是第三次聚会的工具,我不能改变。其中一个只接受字节[],另一个只接受ref float[]

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


有什么办法可以做到这一点吗?可能使用不安全代码或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采用较低的级别,例如
字节*
,可能会有一种方法,但是C#中的数组是一个成熟的对象,它唯一想做的就是分配自己的内存。

也许,值得一提的是,C#中存在这个问题(因为您标记了多种语言)。在C++中,将浮点数组重新解释为字节数组不是问题,IMPO。这些不同的API管理的(例如.NET程序集)还是非托管的(例如,您用PNECK帮助处理的DLL)?我在问题上添加了一个C++标签,因为我知道C++是可能的,我想我可以在托管浮点数组中得到第一个元素的本地指针。但我不知道如何从中获得有效的托管字节数组。需要字节数组的API是托管的,而接受浮点数组的API是COM对象的RCW。我现在无法测试它,但是否可以将IntPtr转换为字节[]?