暂时固定所有内容
本文关键字: | 更新日期: 2023-09-27 18:33:09
我正在尝试将对象森林从 C# .NET 封送到本机C++。也就是说:我有一个包含数亿个对象(如果不是更多(的图表,我希望在本机C++中使用。将其视为正常的"叶子"/"节点"构造,叶子和节点之间有指针。我控制C++和 C# 代码,因此可以对代码进行调整。
出于性能原因,该软件的内部循环将以本机C++实现。我基本上想告诉 GC 停止一段时间(以确保对象不会移动(,然后做花哨的C++例程,然后在完成后继续 GC。
还有一些事情我不想做:
- 制作我自己的标记和扫描算法来固定图形中的所有对象。这不仅非常耗时,而且还会花费大量内存,因为我必须自己跟踪所有这些
GCHandle
对象。 - 使用本机分配方法,如
malloc
.我过去有一个本机C++应用程序,它受到内存碎片的严重影响,.NET "自动"解决得很好......更不用说GC的好处了。
那么,关于如何做到这一点的任何建议?
我将研究如何使用托管C++。
- 也许从管理C++访问 .NET 对象会足够快。
- 否则,请使用托管C++"遍历".net 对象并创建本机C++对象,并在完成后将其全部删除。
- 或者在管理C++中创建一个可用于创建可从 C# 调用的C++对象的类工厂类,完成后再次将它们全部删除。
- 或者按照 Marc Gravel 所说,手动分配非托管内存缓冲区,并处理该空间内的结构,也许使用从 C# 类上的属性驱动的代码生成器。