.Net中的数据结构保持异构结构在内存中是连续的

Rom*_*tel 5 .net c# data-structures cpu-cache

我正在寻找.Net中的数据结构,它保持异构结构在内存中连续,以便对cpu-cache友好.

这个类型的数据结构在这个博客中解释:T-machine.orgIteration 4.

在.Net中,值类型(结构)数组使数据在内存中保持连续,但这仅适用于非泛型数组.我试图创建一个ValueType[],但结构框是盒装的.因此,引用在内存中是连续的,而不是真实的数据.

经过多次尝试,我认为在.Net中本身不可能.我看到的唯一可能的解决方案是手动管理字节数组中结构的分类和反序列化,但我不认为它会是高性能的.

你找到了原生解决方案吗?我的更好的解决方案?

编辑1:我正在尝试实现T-Machine.org博客中描述的实体组件系统.

xan*_*tos 3

不可以。在 C# 中无法执行迭代 4 。您无法决定 .NETstructclass将放在内存中的哪个位置。没有什么类似于C++的Placement New

\n

但请注意,即使是迭代 4,问题似乎也多于解决方案:

\n
\n

此时,我们的迭代非常好,但我们\xe2\x80\x99看到一些重复出现的问题:

\n
    \n
  • 添加/删除组件时重新分配数组(我\xe2\x80\x99上面没有涵盖这个\xe2\x80\x93如果你\xe2\x80\x99不熟悉这个问题,谷歌\xe2\x80\x9cC动态数组\xe2\x80\x9d)
  • \n
  • 碎片(影响迭代 1 之后的每次迭代,这不会变得更糟,因为它已经很糟糕了)
  • \n
  • 交叉引用(我跳过了)
  • \n
\n
\n

\n

如果你有struct大约相同的大小,联合技巧就足够了......

\n
public enum StructType\n{\n    Velocity = 0,\n    Position = 1,\n    Foo = 2,\n    Bar = 3,\n}\n\npublic struct Velocity\n{\n    public int Vx;\n    public int Vy;\n}\n\npublic struct Position\n{\n    public int X;\n    public int Y;\n    public int Z;\n}\n\npublic struct Foo\n{\n    public double Weight;\n    public double Height;\n    public int Age;\n}\n\npublic struct Bar\n{\n    public int ColorR;\n    public int ColorG;\n    public int ColorB;\n    public int Transparency;\n}\n\n[StructLayout(LayoutKind.Explicit)]\npublic struct SuperStruct\n{\n    [FieldOffset(0)]\n    public StructType StructType;\n\n    [FieldOffset(4)]\n    public Velocity Velocity;\n\n    [FieldOffset(4)]\n    public Position Position;\n\n    [FieldOffset(4)]\n    public Foo Foo;\n\n    [FieldOffset(4)]\n    public Bar Bar;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

“正式”在 C# 中没有 C 联合体。但通过使用FixedLayoutandFieldOffset你可以创建它们。请注意,它们与引用类型完全不兼容,并且显然 的大小SuperStruct将是最大可能元素的大小。在本例中为 32 字节,因为Foo是 20 字节,但在其前后需要一些填充以与 8 字节边界对齐。

\n

显然你的数组将是SuperStruct类型。请注意,按照Iterion 4示例,这StructType并不是绝对必要的,因为元素的类型是写在其他地方的。

\n