我猜这个问题的答案将是“不可能,切换到 C++”。但我想我还是要把它扔出去。
我正在处理一个巨大的二叉树。我有一个结构数组来表示我在遍历树时用来帮助处理内存局部性的分支节点。
为了节省一点内存,从而提高缓存局部性,我正在考虑重叠叶节点的对象引用。该对象引用将指向所有叶子数据。基本上,是这样的:
[StructLayout(LayoutKind.Explicit)]
struct BranchData
{
[FieldOffset(0)] // 1 byte
internal byte SplitIndex;
[FieldOffset(1)] // 4 bytes
internal float SplitValue;
[FieldOffset(5)] // 4 bytes
internal int LowIndex;
[FieldOffset(9)] // 4 bytes
internal int HighIndex;
[FieldOffset(0)] // 8 bytes (We're working with x64 here)
internal LeafData Node;
}
以上给出了以下运行时错误
无法从程序集“WindowsFormsApplication1,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null”加载类型“BranchData”,因为它包含偏移量 0 处的对象字段,该对象字段未正确对齐或被非对象字段重叠。
我可以使用一个单独的数组来存储叶数据,并使用索引指向该数组,但是我有 2 个内存查找(对于那些肯定是遥远的内存区域)。一个用于叶子数组中的位置以获取引用,一个用于获取叶子数据。如果我能实现这种重叠,我就会摆脱其中一个查找。
我能够固定对象并使用不安全的代码来解决这个问题。速度是这里的关键因素。