![]() |
1
4
首先,如果您正常使用c,由于垃圾收集器正在移动数据,所以您不能突然获得空引用,因为垃圾收集器也会更新所有引用,因此您不必担心它会移动数据。 你可以把事情固定在记忆中,但这可能会导致比它解决的问题更多的问题。首先,它防止垃圾收集器正确压缩内存,并可能以这种方式影响性能。 我想从你的文章中说的一件事是,使用结构可能不会像你希望的那样有助于性能。C无法内联任何涉及结构的方法调用,即使它们在最新的运行时测试版中修复了这一问题,结构通常也不能很好地执行。 就我个人而言,我认为这样的C++技巧通常不太适合C语言。您可能需要学会放手一点;还有其他更微妙的方法来提高性能;) |
![]() |
2
2
静态内存管理器实际上在做什么?除非它在做不安全的事情(p/invoke,不安全的代码),否则您看到的行为是程序中的一个bug,而不是由于clr的行为。 第二,对于结构之间的链接,“指针”是什么意思?你的字面意思是不安全的kdtree*指针吗?不要那样做。相反,使用数组中的索引。因为我希望单个树的所有节点都存储在同一个数组中,所以您不需要对该数组进行单独的引用。只要一个索引就行了。 最后,如果您确实必须使用kdtree*指针,那么静态内存管理器应该使用marshal.allochglobal或其他非托管内存源来分配一个大的块;它应该将这个大的块视为kdtree数组(即索引kdtree*c样式)。 和 它应该通过碰撞一个“空闲”指针,从这个数组中子分配节点。 当然,如果必须调整这个数组的大小,那么就需要更新所有指针。 这里的基本经验是不安全指针和托管内存 不 混合“fixed”块之外的内容,当然这些块具有堆栈帧关联性(即,当函数返回时,固定行为消失)。有一种方法可以使用gchandle.alloc(your array,gchandleType.pinned)固定任意对象,如数组,但几乎可以肯定,您不想沿着该路径移动。 如果你更详细地描述你在做什么,你会得到更合理的答案。 |
![]() |
3
1
如果你 真的? 要做到这一点,您可以使用gchandle.alloc方法来指定指针应该固定,而不会像fixed语句那样在作用域的末尾自动释放。 但是,正如其他人所说,这样做对垃圾收集器造成了不适当的压力。仅仅创建一个结构来保存一对节点,然后管理一个节点数组而不是一个节点数组怎么样? 如果您真的想完全非托管地访问一块内存,最好是直接从非托管堆分配内存,而不是永久地固定托管堆的一部分(这会阻止堆能够正确地压缩自己)。一种快速而简单的方法是使用marshal.allochGlobal方法。 |
![]() |
4
0
是否确实禁止存储数组引用和索引对? |
![]() |
5
0
事实上,我说的是不安全的指针。我想要的是
我仔细研究了一下,发现它已经在.net 3.5sp1中修复了;我假设这就是您所说的运行时测试版。事实上,我现在明白了这个变化导致了我的渲染速度翻倍。现在,structs在x86系统上的性能得到了极大的提高(x64预先具有更好的struct性能)。 |
![]() |
giantjenga · 优化整数向量到二进制向量的转换 8 月前 |
![]() |
Daniel Lobo · 使用约束进行优化 8 月前 |
![]() |
Imyaf · 在什么条件下,在组装时对“if”和“if-else”进行比较? 12 月前 |
![]() |
Sergio · python中大量数字的乘法 1 年前 |
![]() |
Sergey Dev · 临时表与表变量 1 年前 |
![]() |
John · 减少C中的内存消耗++ 1 年前 |