在 C# 中,可以声明具有指针类型成员的结构(或类),如下所示:
unsafe struct Node
{
public Node* NextNode;
}
使用这种结构是否安全(错误..暂时忽略那个具有讽刺意味的小unsafe
标志..)?我的意思是长期存储在堆上。据我了解,GC 可以自由移动事物,并且在更新对已移动事物的引用时,它是否也更新指针?我猜不,这会使这种结构非常不安全,对吧?
我敢肯定有更好的替代方法来做到这一点,但称之为病态的好奇心。
编辑:似乎有些混乱。我知道这不是一个很好的结构,我纯粹想知道这是否是一个安全的结构,即:是否保证指针始终指向您最初指向的任何内容?
原始的 C 代码用于在没有递归的情况下遍历树(深度优先),其中树存储在数组中。然后通过增加一个指针来遍历该数组,除非满足某个条件,否则将指针设置为 NextNode,继续遍历。当然,在 C# 中也可以通过以下方式完成:
struct Node
{
public int NextNode;
... // other fields
}
其中int
是下一个节点的数组中的索引。但是出于性能原因,我最终还是会摆弄指针和fixed
数组以避免边界检查,而原始的 C 代码似乎更自然。