使用固定指针将大型数据结构传递给非托管代码
Passing large data structures to unmanaged code using fixed pointer
我正在开发一个由两部分组成的应用程序:
- C#前端
- C++数字运算器
在某些情况下,从C#传递到C++的数据量可能非常大。我说的是Gb,也许更多。特别是有一个很大的double数组,我想把一个指向这个数组的固定指针传递给C++代码。数字运算可能需要几个小时才能完成。我担心使用固定指针会引发任何问题。在我看来,垃圾收集器在很长一段时间内都无法触及这个大内存区域。这会引起什么问题吗?我应该考虑另一种策略吗?
我想,我可以提供一个接口,从C++代码中构建这个数组,这样内存就归应用程序的非托管部分所有,而不是传递整个数组。但最终,这两种策略都会创建一大块内存,在很长一段时间内,这些内存对于C#垃圾收集器来说是不可重定位的。我是不是错过了什么?
您没有问题。大型数组在大型对象堆中分配。固定它们不会产生任何不利影响,LOH不会被压实。这里的"Large"是指32位代码中包含1000个或更多元素的double数组,或等于或大于85000字节的任何数组。
对于您的特定用例,使用内存映射文件作为c#和c++代码之间的共享内存缓冲区可能是值得的。这完全绕过了垃圾收集器。还允许操作系统缓存寻呼机处理内存压力问题,而不是GC管理的内存。
相关文章:
- 如何在 c++ 非托管代码中反序列化 byte[] 的 json 字符串?
- 如何使用指针直接从托管代码中的非托管代码中读取矢量数据
- 异步接口托管 - > 非托管代码
- 从C++(非托管代码)检索数组到 C 尖锐形式(托管)
- 将C++非托管代码转换为 C#
- 将托管事件处理程序传递给 Linux 中的非托管代码
- 使用 P/Invoke 时存储非托管代码的数据
- Windows 服务导入C++非托管代码
- P/从获取"tried to access protected memory error"调用非托管C++代码
- 将数据从非托管代码传递到托管代码
- 从 VB.NET 调用非托管代码C++ dll
- 当C#中的字节数组传递给结构中的非托管代码时,会发生什么情况
- 在托管代码和非托管代码之间传递非托管结构的安全数组
- 如何调试C++非托管代码中的较低级别文件访问异常/崩溃
- 自定义Direct2D呈现托管代码和非托管代码之间的批封送处理
- winform中的C++非托管代码
- 如何减少 Visual Studio 非托管代码中的发布生成时间
- 使用固定指针将大型数据结构传递给非托管代码
- 在托管代码和非托管代码之间传递结构
- 访问非托管C代码中的结构体