我正在开发一个由两部分组成的应用程序:
在某些情况下,从C#传递到C ++的数据量可能非常大。我在谈论Gb,也许更多。特别是有大量的双精度数,我想将一个固定/固定指针传递给这个数组到C ++代码。数字运算可能需要几个小时才能完成。我担心这种钉扎指针的使用会引发任何问题。在我看来,垃圾收集器将无法长时间触摸这个大内存区域。这会导致任何问题吗?我应该考虑不同的策略吗?
我认为不是传递整个数组,而是可以提供一个用于在C ++代码中构建此数组的接口,以便内存由应用程序的非托管部分拥有。但最终这两种策略都会创建一大块内存,这些内存长时间无法为C#垃圾收集器重定位。我错过了什么吗?
答案 0 :(得分:1)
你没有问题。大型数组在大对象堆中分配。固定它们不会产生任何不利影响,LOH不会被压缩。 “Large”在这里表示具有1000个或更多元素的双精度数组,用于32位代码或任何等于或大于85,000字节的数组。
答案 1 :(得分:0)
对于您的特定用例,使用内存映射文件作为c#和c ++代码之间的共享内存缓冲区可能是值得的。这完全绕开了垃圾收集器。并且还允许OS缓存寻呼机处理内存压力问题,而不是GC管理内存。