使用固定指针将大型数据结构传递给非托管代码

时间:2013-11-22 21:08:24

标签: c# c++ interop

我正在开发一个由两部分组成的应用程序:

  1. C#front-end
  2. C ++ number cruncher
  3. 在某些情况下,从C#传递到C ++的数据量可能非常大。我在谈论Gb,也许更多。特别是有大量的双精度数,我想将一个固定/固定指针传递给这个数组到C ++代码。数字运算可能需要几个小时才能完成。我担心这种钉扎指针的使用会引发任何问题。在我看来,垃圾收集器将无法长时间触摸这个大内存区域。这会导致任何问题吗?我应该考虑不同的策略吗?

    我认为不是传递整个数组,而是可以提供一个用于在C ++代码中构建此数组的接口,以便内存由应用程序的非托管部分拥有。但最终这两种策略都会创建一大块内存,这些内存长时间无法为C#垃圾收集器重定位。我错过了什么吗?

2 个答案:

答案 0 :(得分:1)

你没有问题。大型数组在大对象堆中分配。固定它们不会产生任何不利影响,LOH不会被压缩。 “Large”在这里表示具有1000个或更多元素的双精度数组,用于32位代码或任何等于或大于85,000字节的数组。

答案 1 :(得分:0)

对于您的特定用例,使用内存映射文件作为c#和c ++代码之间的共享内存缓冲区可能是值得的。这完全绕开了垃圾收集器。并且还允许OS缓存寻呼机处理内存压力问题,而不是GC管理内存。