2013-11-22 39 views
1

我正在开发其由两个部分组成的应用程序:传递大的数据结构以非托管代码使用固定指针

  1. C#前端
  2. C++算术达

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

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

回答

1

您没有问题。大型数组分配在大型对象堆中。钉住它们不会有任何有害的影响,蕙没有压缩。这里的“大”表示32位代码或任何等于或大于85,000字节的数组具有1000个或更多元素的双精度数组。

+1

在LOH中多次分配高达GB或更多没有不利影响? – Alex

+0

从.net 4.5.1开始,可以“按需”对LOH进行压缩(http://blogs.msdn.com/b/mariohewardt/archive/2013/06/26/no-more-memory-fragmentation-on- the-large-object-heap.aspx) –

+0

@ Christian.K所以它不是自动的,而是每个方法的调用。看来我很好吗? – Max

0

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

相关问题