在 C# 中,可以声明具有指针类型成员的结构(或类),如下所示:
unsafe struct Node
{
public Node* NextNode;
}
它是否安全(呃..暂时忽略那个具有讽刺意味的小unsafe
标志..)使用这个结构?我的意思是在堆上长期存储。据我了解,GC 可以自由地移动事物,当它更新对已移动事物的引用时,它是否也会更新指针?我猜不会,这会让这个建筑非常不安全,对吗?
我确信有更好的选择来做到这一点,但称之为病态好奇心。
编辑:似乎有些混乱。我知道这不是一个伟大的建筑,我purely想知道这是否是一个安全的构造,即:指针是否保证继续指向您最初指向的内容?
原始的 C 代码用于在没有递归的情况下遍历树(深度优先),其中树存储在数组中。然后通过递增指针来遍历数组,除非满足特定条件,否则将指针设置为 NextNode,继续遍历。当然,在 C# 中也可以通过以下方式完成同样的任务:
struct Node
{
public int NextNode;
... // other fields
}
哪里的int
是数组中下一个节点的索引。但出于性能原因,我最终会摆弄指针和fixed
无论如何,数组都可以避免边界检查,并且原始的 C 代码似乎更自然。
使用这种结构安全吗?我的意思是在堆上长期存储。
是的。这样做通常是愚蠢的、痛苦的和不必要的,但这是可能的。
据我了解,GC 可以自由地移动事物,当它更新对已移动事物的引用时,它是否也会更新指针?
No. 这就是为什么我们让您将其标记为不安全。
我猜不会,这会让这个建筑非常不安全,对吗?
Correct.
我确信有更好的选择来做到这一点,但称之为病态好奇心。
当然有。
指针是否保证继续指向您最初指向的内容?
除非你确保这种情况发生。有两种方法可以做到这一点。
方式一:告诉垃圾收集器不要移动内存。有两种方法可以做到这一点:
执行这些操作中的任何一个都很可能会破坏垃圾收集器的性能。
方法二:不要引用垃圾收集器可能移动的内存。有两种方法可以做到这一点:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)