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

Passing large data structures to unmanaged code using fixed pointer

本文关键字:数据结构 非托管代码 大型 定指 指针      更新时间:2023-10-16

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

  1. C#前端
  2. C++数字运算器

在某些情况下,从C#传递到C++的数据量可能非常大。我说的是Gb,也许更多。特别是有一个很大的double数组,我想把一个指向这个数组的固定指针传递给C++代码。数字运算可能需要几个小时才能完成。我担心使用固定指针会引发任何问题。在我看来,垃圾收集器在很长一段时间内都无法触及这个大内存区域。这会引起什么问题吗?我应该考虑另一种策略吗?

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

您没有问题。大型数组在大型对象堆中分配。固定它们不会产生任何不利影响,LOH不会被压实。这里的"Large"是指32位代码中包含1000个或更多元素的double数组,或等于或大于85000字节的任何数组。

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