暂时固定一切

时间:2014-12-04 11:01:47

标签: c# .net garbage-collection pinvoke

我试图将C#.NET中的对象林编组为本机C ++。那就是:我有一个数亿个对象(如果不是更多)的图表,我希望在原生C ++中使用它。将其视为正常的“叶子”节点'叶子和节点之间的指针构造。我控制C ++和C#代码,所以我可以调整代码。

出于性能原因,软件的内部循环将以本机C ++实现。我基本上想告诉GC停止一段时间(以确保对象不被移动),然后执行奇特的C ++例程,然后在完成后继续GC。

还有一些我不想做的事情:

  • 制作自己的标记&扫描算法固定图中的所有对象。这不仅非常耗时,而且还会花费大量内存,因为我必须自己跟踪所有这些GCHandle个对象。
  • 使用malloc等原生分配方法。我过去曾经有过一个原生的C ++应用程序,它因内存碎片而遭受很大的损失,而且.NET会自动地使用它。解决得很好......更不用说GC的好处了。

那么,有关如何做到这一点的任何建议吗?

1 个答案:

答案 0 :(得分:1)

我将介绍使用托管C ++。

  • 也许从manage C ++访问.NET对象就足够了。
  • 否则使用托管C ++“遍历”.net对象并创建本机C ++对象,一旦完成就删除它们。
  • 或者在manage C ++中创建一个类工厂类,可以用来创建可以从C#调用的C ++对象,一旦完成就再次删除它们。
  • 或者像Marc Gravel所说的那样,手动分配非托管内存的缓冲区,并处理该空间内的结构,也许使用由C#类属性驱动的代码生成器。