我是 stackoverflow 的新手,我会对 C# 结构及其布局有疑问。
让我们假设以下结构:
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public unsafe struct Link
{
// some primitive data (2 integers for example)
}
[StructLayout(LayoutKind.Explicit, Pack = 1)]
public unsafe struct Node
{
[FieldOffset(0)]
public int LinkCount;
[FieldOffset(4)]
public Link* Links;
[FieldOffset(4)]
private fixed byte _linksData[10 * sizeof(Link)];
}
这样做的原因是我需要 IO-Performance 的 blittable 类型。我必须处理具有数 GB 大小的非常大(并且每个节点最多稀疏 10 个链接)图。该图表示为节点结构数组。通过上面的设置,我希望能够从图形文件中读取例如 100 MB 到字节指针(当然指向字节缓冲区)并将其转换为 Node* 类型的指针,从而产生非常好的表现。起初,我的节点结构只有 10 个独立的 Link 类型变量(Link0,...,Link10),它们工作得很好。但是最好在编译时使其可配置,这会导致上面的 Node-struct。
我希望 Links 只指向与 _linksData 相同的内存位置,因为它具有相同的 FieldOffset。但实际上 Links 指针始终是空指针。
所以我的问题是:有没有一种方法可以使 Links 指向与 _linksData 相同的内存位置,或者是否有另一种方法可以将固定大小的结构数组嵌入到另一个结构中。
提前感谢您的每一个回答 - 马库斯
在阅读了 Ben Voigt 的帖子后,我尝试了类似的方法,而无需将结构更改为类。以下是它对我的工作方式:
[StructLayout(LayoutKind.Explicit, Pack = 1)]
public unsafe struct Node
{
[FieldOffset(0)]
public int LinkCount;
[FieldOffset(4)]
private fixed byte _linksData[10 * sizeof(Link)];
public Link* GetLinks()
{
fixed(byte* pLinksData = _linksData)
{
return (Link*)pLinksData;
}
}
}